¿Por qué dura tanto la ejecución de mi trabajo de ETL de AWS Glue?

7 minutos de lectura
0

La ejecución de mi trabajo de AWS Glue dura mucho o mi tarea rezagada de AWS Glue tarda mucho en completarse.

Breve descripción

Puede que su trabajo de AWS Glue tarde mucho tiempo en completarse por los siguientes motivos:

  • Conjuntos de datos de gran tamaño
  • Distribución no uniforme de los datos en los conjuntos de datos
  • Distribución desigual de las tareas entre los ejecutores
  • Recursos sin aprovisionamiento suficiente

Solución

Activación de las métricas

AWS Glue utiliza las métricas de Amazon CloudWatch para proporcionar información sobre los ejecutores, como la cantidad de trabajo de cada ejecutor. Si usa la versión 3.0 o posterior de AWS Glue, también puede usar la interfaz de usuario de Spark sin servidor y las métricas de observabilidad de AWS Glue. Para obtener más información, consulte Turning on the Apache Spark web UI for AWS Glue jobs y Monitoring with AWS Glue Observability metrics.

Para activar las métricas de CloudWatch para su trabajo de AWS Glue, puede usar un parámetro especial, la consola de AWS Glue o una API.

Utilización de un parámetro especial

Agregue el siguiente argumento a su trabajo de AWS Glue:

Key: --enable-metrics

Nota: El parámetro enable-metrics permite recopilar métricas para la elaboración de perfiles de trabajos para la ejecución de su trabajo. Las métricas están disponibles en la consola de AWS Glue y en la de CloudWatch.

Utilización de la consola de AWS Glue

Siga estos pasos:

  1. Abra la consola de AWS Glue.
  2. En el panel de navegación, elija Trabajos.
  3. Seleccione el trabajo para el que desee activar las métricas.
  4. Elija Acción y, a continuación, Editar trabajo.
  5. En Opciones de supervisión, seleccione Métricas de trabajo.
  6. Seleccione Guardar.

Utilización de la API

Utilice la API UpdateJob de AWS Glue con --enable-metrics como parámetro DefaultArguments.

Nota: AWS Glue 2.0 no utiliza YARN para notificar las métricas porque no es posible obtener algunas de las métricas del ejecutor, como numberMaxNeededExecutors y numberAllExecutor.

Activación del registro continuo

Si activa el registro continuo para su trabajo de AWS Glue, los registros del controlador y el ejecutor en tiempo real se envían a CloudWatch cada 5 segundos. Si utiliza la información de los registros en tiempo real, obtendrá más detalles sobre el trabajo. Para obtener más información, consulte Turning on continuous logging for AWS Glue jobs.

Comprobación de los registros del controlador y el ejecutor

En los registros del controlador, compruebe si hay tareas que tardan mucho en ejecutarse antes de completarse. En el siguiente ejemplo, una tarea tardó 77 minutos en completarse:

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)

Para averiguar por qué la tarea tardó tanto en completarse, utilice la interfaz de usuario web de Apache Spark.

Activación de la interfaz de usuario de Spark

Cuando inicia el servidor de historial de Spark y activa los registros de la interfaz de usuario de Spark, puede acceder a la información sobre las etapas y las tareas del registro. Utilice los registros para saber cómo ejecutan las tareas los trabajadores. Para obtener más información, consulte Turning on the Apache Spark web UI for AWS Glue jobs.

Nota: Si usa la Interfaz de la línea de comandos de AWS (AWS CLI) para activar la interfaz de usuario de Spark, asegúrese de usar la versión más reciente de la AWS CLI. Si se muestran errores al ejecutar comandos de la AWS CLI, consulte Errores de solución de problemas de la AWS CLI.

Una vez finalizado el trabajo, es posible que vea registros del controlador similares a los del siguiente ejemplo:

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

Utilice una instancia de Amazon Elastic Compute Cloud (Amazon EC2) o Docker para iniciar el servidor de historial de Spark. Abra la interfaz de usuario y navegue hasta la pestaña Ejecutor para comprobar si algún ejecutor lleva mucho tiempo en ejecución. Si un ejecutor se ejecuta durante mucho tiempo, un sesgo en el conjunto de datos puede provocar una distribución desigual del trabajo y una infrautilización de los recursos. En la pestaña Etapas, revise la información y las estadísticas de las etapas que han durado mucho tiempo.

Planificación de la capacidad de las DPU

Si todos los ejecutores contribuyen por igual y el trabajo tarda mucho, añada más trabajadores a su trabajo para mejorar la velocidad. La planificación de la capacidad de las unidades de procesamiento de datos (DPU) puede ayudarle a evitar los siguientes problemas:

  • Un aprovisionamiento insuficiente, que podría dar lugar a un tiempo de ejecución más lento
  • Un aprovisionamiento excesivo, que generaría más costos, pero proporcionaría resultados en la misma extensión de tiempo

Cuando usa las métricas de CloudWatch, puede obtener información sobre la cantidad de ejecutores actualmente en uso y la cantidad máxima de ejecutores que se requieren. La cantidad de DPU que se requieren depende de la cantidad de particiones de entrada y del tipo de trabajo solicitado.

El tipo de archivo de Amazon Simple Storage Service (Amazon S3) que utilice y el tipo de datos determinarán el número de particiones que deberá definir:

  • En el caso de los archivos de Amazon S3 que no se pueden fragmentar, el número de particiones es igual al número de archivos de entrada.
  • En el caso de los archivos de Amazon S3 que se pueden fragmentar, si los datos no están estructurados o solo semiestructurados, el número de particiones es igual al tamaño del archivo dividido entre 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.
  • En el caso de los archivos de Amazon S3 que se pueden fragmentar, si los datos estructurados, el número de particiones es igual al tamaño total del archivo dividido entre 128 MB.

A continuación se muestra un ejemplo de cómo calcular la cantidad óptima de DPU. En este ejemplo, el número de particiones de entrada es 240. Utilice la siguiente fórmula para calcular el número óptimo de DPU:

Cantidad máxima de ejecutores requeridos = Cantidad de particiones de entrada / Cantidad de tareas por ejecutor

Nota: En Glue 2.0 y versiones anteriores con un tipo de trabajador G1.X, el número máximo de ejecutores necesarios es igual a 240 dividido entre ocho. El resultado es 30. En Glue 3.0 y versiones posteriores con un tipo de trabajador G1.X, el número máximo de ejecutores necesarios es igual a 240 dividido entre cuatro. El resultado es 60.

Cuando planifique la capacidad de DPU para AWS Glue versión 3.0 o posterior, utilice un tipo de trabajador que admita la cantidad de tareas necesarias para cada ejecutor. Cada tipo de trabajador admite un número diferente de tareas por ejecutor:

  • El tipo de trabajador estándar admite cuatro tareas por ejecutor.
  • G.1X admite cuatro tareas por ejecutor.
  • G.2X admite ocho tareas por ejecutor.
  • G.4X admite 16 tareas por ejecutor.
  • G.8X admite 32 tareas por ejecutor.

Ejemplo de Glue 2.0 y versiones anteriores

El tipo de trabajador G1.X tiene un ejecutor por trabajador y un nodo de controlador para un trabajo de Glue. Según el siguiente ejemplo, necesita 30 ejecutores:
Número de DPU necesarias = (Número de ejecutores / Número de ejecutores por nodo) + 1 DPU = (30/1) + 1 = 31

Ejemplo de Glue 3.0 y versiones posteriores

El tipo de trabajador G1.X tiene un ejecutor por trabajador y un nodo de controlador para un trabajo de Glue. Según el siguiente ejemplo, necesita 60 ejecutores.
Número de DPU necesarias = (Número de ejecutores / Número de ejecutores por nodo) + 1 DPU = (60/1) + 1 = 61

Información relacionada

AWS Glue job parameters

Monitoring jobs using the Apache Spark web UI

Monitoring for DPU capacity planning

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 10 meses