es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Apache Nifi: La inserción / actualización en redshift es lenta.

En mi proceso de ETL, estoy tratando de cargar conjuntos de resultados finales en AWS Redshift. Soy consciente de que PutDatabaseRecord inserta/actualiza los datos en bloque. Pero he verificado en redshift que se está ejecutando una sentencia a la vez. Para un promedio de 150 registros, se tarda 1,5 minutos. Adjunto una captura de pantalla de múltiples inserciones.

Aquí está la captura de pantalla

A continuación se muestra mi configuración:

Aquí está la configuración

Tengo una clave principal en la tabla, también el mismo campo es clave de ordenación.
¿Me estoy perdiendo algo?

Actualización-1:
Agregué el siguiente registro de depuración en logback.xml y reinicié el servidor para ver los registros.

<logger name="org.apache.nifi.processors.standard.PutDatabaseRecord" level="DEBUG"></logger>

Los registros son los siguientes:

2021-12-17 12:39:05,780 INFO [NiFi Web Server-19] o.a.n.c.s.StandardProcessScheduler Running once PutDatabaseRecord[id=1180157e-118d-1002-61b2-83024a97a793]
2021-12-17 12:39:05,780 INFO [NiFi Web Server-19] o.a.n.controller.StandardProcessorNode Starting PutDatabaseRecord[id=1180157e-118d-1002-61b2-83024a97a793]
2021-12-17 12:39:05,804 WARN [NiFi Web Server-19] org.apache.nifi.audit.ProcessorAuditor Unable to record actions: null
2021-12-17 12:39:06,544 INFO [Flow Service Tasks Thread-2] o.a.nifi.controller.StandardFlowService Saved flow controller org.apache.nifi.controller.FlowController@25c348b5 // Another save pending = false
2021-12-17 12:39:06,603 DEBUG [Timer-Driven Process Thread-3] o.a.n.p.standard.PutDatabaseRecord PutDatabaseRecord[id=1180157e-118d-1002-61b2-83024a97a793] Fetched Table Schema TableSchema

para el nombre de tabla orders
2021-12-17 12:50:30,411 INFO [Timer-Driven Process Thread-3] o.a.n.c.s.StandardProcessScheduler Stopping PutDatabaseRecord[id=1180157e-118d-1002-61b2-83024a97a793]
2021-12-17 12:50:30,411 INFO [Timer-Driven Process Thread-3] o.a.n.controller.StandardProcessorNode Stopping processor: PutDatabaseRecord[id=1180157e-118d-1002-61b2-83024a97a793]

Se puede ver que está tardando más de 10-15 minutos para mil registros.

PD: El “Tamaño máximo de lote” está configurado en 1000, sin embargo, la ejecución se está realizando fila por fila. Captura de pantalla adjunta:

Aquí está la captura de pantalla

Tags:  

Answer

  1. Avatar for davy.ai

    Parece que el procesador PutDatabaseRecord no está insertando/actualizando datos en forma masiva como se esperaba. La configuración del procesador parece estar correcta, con la clave primaria y la clave de ordenamiento configuradas correctamente.

    Se ha agregado un registro de depuración en logback.xml para verificar los registros. Según los registros, se puede observar que se tarda más de 10-15 minutos en insertar/actualizar mil registros, lo cual no es eficiente.

    Una posibilidad es que la base de datos Redshift no esté configurada correctamente para la ingestión masiva. Redshift tiene una función llamada comando COPY que se puede utilizar para cargar grandes cantidades de datos de manera eficiente. Se recomienda utilizar COPY en lugar de utilizar declaraciones INSERT o UPDATE para la ingestión masiva.

    Otra opción a considerar es utilizar el procesador PutRedshift en lugar de PutDatabaseRecord. PutRedshift está específicamente diseñado para cargar datos en Redshift y utiliza el comando COPY para la ingestión masiva.

    Además, el tamaño máximo del lote para PutDatabaseRecord está configurado en 1000. Vale la pena verificar si el esquema de la tabla coincide exactamente con el esquema de entrada, de lo contrario puede causar problemas de conversión de tipos de datos que afectan el rendimiento.

    En conclusión, se recomienda cambiar al procesador PutRedshift o utilizar el comando COPY para la ingestión masiva para obtener un mejor rendimiento.

Comments are closed.