¿Por qué se produce un error de pérdida de nodos en mi trabajo de AWS Glue cuando intento migrar un conjunto de datos grande de Amazon RDS a Amazon S3?

4 minutos de lectura
0

Estoy migrando un conjunto de datos grande de Amazon Relational Database Service (Amazon RDS) o una base de datos de JDBC local a Amazon Simple Storage Service (Amazon S3) mediante AWS Glue. La ejecución de mi trabajo de ETL dura mucho tiempo y al final se produce un error con pérdida de nodos.

Breve descripción

AWS Glue solo utiliza una conexión para leer todo el conjunto de datos. Si va a migrar una tabla grande de JDBC, es posible que la ejecución del trabajo de ETL se prolongue durante mucho tiempo sin que haya indicios de progreso en AWS Glue. En tal caso, se podría producir un error en el trabajo por problemas con el espacio en disco (pérdida de nodos). Para solucionar este problema, lea la tabla de JDBC en paralelo. Si el error de pérdida de nodos persiste en el trabajo, utilice una expresión de SQL como predicado de apilado.

Solución

Utilice uno o varios de los siguientes métodos para solucionar los errores de pérdida de nodos en conjuntos de datos de JDBC.

Lectura en paralelo de la tabla de JDBC

Si la tabla no tiene columnas numéricas (INT o BIGINT), utilice la opción hashfield para fragmentar los datos. Establezca hashfield como nombre de una columna en la tabla de JDBC. Para obtener mejores resultados, elija una columna con una distribución uniforme de los valores.

Si la tabla tiene columnas numéricas, defina las opciones hashpartitions y hashexpression en la tabla o mientras crea el DynamicFrame:

  • hashpartitions: define la cantidad de tareas que creará AWS Glue para leer los datos
  • hashexpression: divide las filas equitativamente entre las tareas

A continuación se muestra un ejemplo de cómo definir hashpartitions y hashexpression mientras se crea un DynamicFrame con una conexión de JDBC. En connection_option, sustituya la URL de JDBC, el nombre de usuario, la contraseña, el nombre de la tabla y el nombre de la columna.

connection_option= {"url": "jdbc:mysql://mysql–instance1.123456789012.us-east-1.rds.amazonaws.com:3306/database", "user": "your_user_name", "password": "your_password","dbtable": "your_table","hashexpression":"column_name","hashpartitions":"10"}

datasource0 = glueContext.create_dynamic_frame.from_options('mysql',connection_options=connection_option,transformation_ctx = "datasource0")

He aquí un ejemplo de cómo se pueden definir hashpartitions y hashexpression mientras se crea un DynamicFrame a partir del catálogo de AWS Glue:

datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "your_database", table_name = "your_table",additional_options={"hashexpression":"column_name","hashpartitions":"10"}, transformation_ctx = "datasource0")

Nota: Establecer valores mayores para hashpartitions puede reducir el rendimiento de la tabla. Esto se debe a que cada tarea lee la tabla entera y, a continuación, devuelve un conjunto de filas al ejecutor.

Para obtener más información, consulte Lectura desde tablas de JDBC en paralelo.

Utilización de una expresión de SQL como predicado de apilado

Nota: La siguiente expresión de SQL no funciona como predicado de apilado en bases de datos de Oracle. Sin embargo, esta expresión funciona como predicado de apilado en todas las demás bases de datos compatibles de forma nativa con AWS Glue (Amazon Aurora, MariaDB, Microsoft SQL Server, MySQL y PostgreSQL).

Si la tabla contiene miles de millones de registros y tebibytes (TiB) de datos, es posible que el trabajo tarde mucho en completarse o que se produzca un error de pérdida de nodos, incluso después de definir hashpartitions y hashexpression. Para solucionar estos problemas, utilice una expresión de SQL parecida a esta con la opción hashexpression:

column_name > 1000 AND column_name < 2000 AND column_name

La expresión de SQL actúa como predicado de apilado y obliga al trabajo a leer un conjunto de filas en cada ejecución del trabajo, en vez de leer todos los datos a la vez. La instrucción al completo se parece a esta:

datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "sampledb", table_name = "test_table",additional_options={"hashexpression":"column_name > 1000 AND column_name < 2000 AND column_name","hashpartitions":"10"}, transformation_ctx = "datasource0")

Nota: Con esta configuración, asegúrese de desactivar los marcadores de trabajo en el caso de las ejecuciones iniciales de trabajos. Si ejecuta un trabajo con un marcador de trabajo, AWS Glue registrará el valor máximo de la columna. Al volver a ejecutar el trabajo, AWS Glue solo procesará las filas que tengan valores superiores al valor del marcador anterior. Puede activar los marcadores de trabajo durante la última ejecución del trabajo si es necesario.


Información relacionada

¿Por qué se produce el error «Estado de salida: -100. Diagnóstico: Contenedor publicado en un nodo *perdido*» en mi trabajo de AWS Glue?

Definición de conexiones en el Catálogo de datos de AWS Glue

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 años