¿Por qué mi trabajo ETL de AWS Glue se ejecuta durante mucho tiempo?

Última actualización: 20/08/2021

Mi trabajo de AWS Glue se ejecuta durante mucho tiempo.

-o bien-

Mi tarea de AWS Glue atrasada tarda mucho en completarse.

Descripción corta

Algunos motivos comunes por los que los trabajos de AWS Glue tardan mucho en completarse son los siguientes:

  • Conjuntos de datos grandes
  • Distribución no uniforme de los datos en los conjuntos de datos
  • Distribución desigual de las tareas entre los ejecutores
  • Bajo aprovisionamiento de recursos

Resolución

Habilitar métricas

AWS Glue ofrece métricas de Amazon CloudWatch que se pueden utilizar para proporcionar información sobre los ejecutores y la cantidad de tareas realizadas por cada ejecutor. Puede habilitar las métricas de CloudWatch en su trabajo de AWS Glue mediante una de las siguientes acciones:

Uso de un parámetro especial: agregue el siguiente argumento a su trabajo de AWS Glue. Este parámetro permite recopilar métricas para la elaboración de perfiles de trabajo en la ejecución del trabajo. Estas métricas están disponibles en la consola de AWS Glue y en la consola de CloudWatch.

Key: --enable-metrics

Uso de la consola de AWS Glue: para habilitar métricas en un trabajo existente, haga lo siguiente:

  1. Abra la consola de AWS Glue.
  2. En el panel de navegación, elija Jobs (Trabajos).
  3. Seleccione el trabajo para el que desea habilitar las métricas.
  4. Elija Action (Acción) y, a continuación, elija Edit job (Editar trabajo).
  5. En Monitoring options (Opciones de monitoreo), seleccione Job metrics (Métricas de trabajo).
  6. Elija Save (Guardar).

Uso de la API: utilice la API de AWS Glue UpdateJob con -enable-metrics como parámetro DefaultArguments para habilitar métricas en un trabajo existente.

Nota: AWS Glue 2.0 no utiliza YARN que informa sobre las métricas. Esto significa que no puede obtener algunas de las métricas de ejecutor, como numberMaxNeededExecutors y numberAllExecutor, para AWS Glue 2.0.

Habilitar el registro continuo

Si habilita el registro continuo en su trabajo de AWS Glue, los registros de ejecutores y controladores en tiempo real se enviarán a CloudWatch cada cinco segundos. Con esta información de registro en tiempo real, puede obtener más detalles sobre el trabajo en ejecución. Para obtener más información, consulte Habilitación del registro continuo para trabajos de AWS Glue.

Verificar los registros de controladores y ejecutores

En los registros de controladores, verifique si hay tareas que se ejecutaron durante mucho tiempo antes de completarse. Por ejemplo:

2021-04-15 10:53:54,484 ERROR executionlogs:128 - g-7dd5eec38ff57a273fcaa35f289a99ecc1be6901:2021-04-15 10:53:54,484 INFO [task-result-getter-1] scheduler.TaskSetManager (Logging.scala:logInfo(54)): Finished task 0.0 in stage 7.0 (TID 139) in 4538 ms on 10.117.101.76 (executor 10) (13/14)
...
2021-04-15 12:11:30,692 ERROR executionlogs:128 - g-7dd5eec38ff57a273fcaa35f289a99ecc1be6901:2021-04-15 12:11:30,692 INFO [task-result-getter-3] scheduler.TaskSetManager (Logging.scala:logInfo(54)): Finished task 13.0 in stage 7.0 (TID 152) in 4660742 ms on 10.117.97.97 (executor 11) (14/14)

En estos registros, puede ver que una sola tarea tardó 77 minutos en completarse. Utilice esta información para revisar por qué esa tarea en particular tarda mucho tiempo. Puede hacerlo mediante la interfaz de usuario web de Apache Spark. La interfaz de usuario de Spark proporciona información bien estructurada para diferentes etapas, tareas y ejecutores.

Habilitar la interfaz de usuario de Spark

Puede utilizar la interfaz de usuario de Spark para solucionar problemas de los trabajos de Spark que se ejecutan durante mucho tiempo. Al lanzar el servidor de historial de Spark y habilitar los registros de la interfaz de usuario de Spark, puede obtener información sobre las etapas y tareas. Puede utilizar los registros para saber cómo los empleados ejecutan las tareas. Puede habilitar la interfaz de usuario de Spark mediante la consola de AWS Glue o AWS Command Line Interface (AWS CLI). Para obtener más información, consulte Habilitación de la interfaz de usuario web de Apache Spark para trabajos de AWS Glue.

Una vez finalizado el trabajo, es posible que vea registros de controladores similares a los siguientes:

ERROR executionlogs:128 - example-task-id:example-timeframe INFO [pool-2-thread-1] s3n.MultipartUploadOutputStream (MultipartUploadOutputStream.java:close(414)): close closed:false s3://dox-example-bucket/spark-application-1626828545941.inprogress

Tras analizar los registros del trabajo, puede lanzar el servidor de historial de Spark en una instancia de Amazon Elastic Compute Cloud (Amazon EC2) o mediante Docker. Abra la interfaz de usuario y vaya a la pestaña Executor (Ejecutor) para verificar si un ejecutor concreto se ejecuta durante más tiempo. De ser así, la distribución desigual del trabajo y la infrautilización de los recursos disponibles podrían deberse a un sesgo de datos en el conjunto de datos. En la pestaña Stages (Etapas), puede obtener más información y estadísticas sobre las etapas que han tardado mucho tiempo. Puede encontrar detalles sobre si estas etapas implicaron fugas aleatorias que son costosas y requieren mucho tiempo.

Planificación de capacidad para unidades de procesamiento de datos (DPU)

Si todos los ejecutores contribuyen por igual para realizar el trabajo, pero el trabajo aún tarda mucho en completarse, considere agregar más empleados a su trabajo con el fin de mejorar la velocidad. La planificación de la capacidad de la DPU puede ayudar a evitar lo siguiente:

  • El bajo aprovisionamiento que podría resultar es un tiempo de ejecución más lento
  • El aprovisionamiento excesivo que genera costos más altos, aunque proporciona resultados en el mismo periodo de tiempo

A partir de las métricas de CloudWatch, puede obtener información sobre el número de ejecutores que se utilizan actualmente y el número máximo de ejecutores necesarios. El número de DPU necesarias depende del número de particiones de entrada y del tipo de empleado solicitado.

Tenga en cuenta lo siguiente al definir el número de particiones de entrada:

  • Si los archivos de Amazon Simple Storage Service (Amazon S3) no se pueden dividir, el número de particiones es igual al número de archivos de entrada.
  • Si los archivos de Amazon S3 se pueden dividir y los datos no están estructurados o semiestructurados, el número de particiones es igual al tamaño total del archivo/64 MB. Si el tamaño de cada archivo es inferior a 64 MB, el número de particiones es igual al número de archivos.
  • Si los archivos de Amazon S3 se pueden dividir y los datos están estructurados, el número de particiones es igual al tamaño total del archivo / 128 MB.

Haga lo siguiente para calcular el número óptimo de DPU:

Por ejemplo, supongamos que el número de particiones de entrada es 428. A continuación, puede calcular el número óptimo de DPU mediante la siguiente fórmula:

Número máximo de ejecutores necesarios = Número de particiones de entrada / Número de tareas por ejecutor = 428 / 4 = 107

Tenga en cuenta lo siguiente:

  • El tipo de empleado estándar admite 4 tareas por ejecutor
  • G.1X admite 8 tareas por ejecutor
  • G.2X admite 16 tareas por ejecutor

El tipo de empleado estándar tiene dos ejecutores, incluido un controlador, en un nodo. Uno de estos ejecutores es un controlador de Spark. Por lo tanto, necesita 108 ejecutores.

El número de DPU necesarias = (Número de ejecutores / Número de ejecutores por nodo) + 1 DPU = (108/2) + 1 = 55.