Mi trabajo de extracción, transformación y carga (ETL) de AWS Glue falla y aparece el error «Container killed by YARN for exceeding memory limits».
Descripción corta
Los motivos más habituales por los que se produce este error son:
- Operaciones que consumen mucha memoria y que superan el umbral de memoria del clúster de Spark subyacente. Estas operaciones pueden incluir la unión de tablas grandes o el procesamiento de conjuntos de datos con un sesgo en la distribución.
- Particiones grandes de datos que consumen más memoria que la asignada al ejecutor respectivo.
- Archivos grandes que no se pueden dividir y dan como resultado particiones en memoria de gran tamaño.
Resolución
Para solucionar este error, completa una o más de estas soluciones.
Actualización del tipo de trabajo
Dado que G.2x tiene configuraciones de memoria superiores, actualiza el tipo de trabajador. Puedes actualizar el tipo de trabajador de G.1x a los siguientes tipos de trabajador:
- G.2x
- G.4x
- G.8x
- G.12x
- G.16x
- R.1x
- R.2x
- R.4x
- R.8x
Para obtener más información sobre las especificaciones de los tipos de trabajadores, consulta Definición de propiedades de trabajo para trabajos de Spark y Versiones de AWS Glue.
Aumento del número de ejecutores para el trabajo
Si el error persiste después de actualizar el tipo de trabajador, aumenta el número de ejecutores del trabajo. Para cada ejecutor, hay un número determinado de núcleos. Este número determina el número de particiones que puede procesar el ejecutor. El tipo de trabajador define las configuraciones de Spark para las unidades de procesamiento de datos (DPU).
Actualización de los datos
Para asegurarte de que AWS Glue utilice ejecutores de manera uniforme antes de una operación aleatoria, como las uniones, comprueba que los datos estén en paralelo. Para volver a hacer particiones en los datos entre todos los ejecutores, incluye uno de los siguientes comandos en tu trabajo de ETL.
Para DynamicFrame, incluye el siguiente comando:
dynamicFrame.repartition(totalNumberOfExecutorCores)
Para DataFrame, incluye el siguiente comando:
dataframe.repartition(totalNumberOfExecutorCores)
Uso de marcadores de trabajo
Cuando usas marcadores de trabajo, el marcador contiene el proceso de trabajo de AWS Glue solo para los archivos recién escritos. Esta configuración reduce la cantidad de archivos que procesa el trabajo de AWS Glue y reduce los problemas de memoria. Los marcadores almacenan los metadatos de los archivos de procesos de la ejecución anterior. En la ejecución posterior, el trabajo compara la marca de tiempo y, a continuación, decide si desea volver a procesar estos archivos. Para obtener más información, consulta Seguimiento de los datos procesados mediante marcadores de trabajo.
Uso de DynamicFrame para leer datos en paralelo
Al conectarte con una tabla de JDBC, Spark abre de forma predeterminada solo una conexión cada vez. El controlador intenta descargar toda la tabla a la vez en un único ejecutor de Spark. Esta descarga puede tardar más y provocar errores de falta de memoria (OOM) para el ejecutor. Puedes optar por establecer propiedades específicas de la tabla JDBC para indicar a AWS Glue que use DynamicFrame para leer los datos en paralelo. O bien, puedes usar Spark DataFrame para lograr lecturas paralelas desde JDBC. Para obtener más información, consulta JDBC to other databases (JDBC a otras bases de datos) en el sitio web de Spark.
Uso de funciones eficaces en el trabajo de ETL
Para tu trabajo de ETL, no utilices funciones definidas por el usuario, especialmente si combinas código de Python o Scala con las funciones y métodos de Spark. Por ejemplo, no utilices df.count() para verificar los DataFrames vacíos en las instrucciones if/else o bucles for. En cambio, utiliza una función con mejor rendimiento, como df.schema() o df.rdd.isEmpty().
Prueba y optimización del trabajo de AWS Glue
Antes de ejecutar el trabajo de AWS Glue en producción, prueba el trabajo de AWS Glue en una sesión interactiva y optimiza el código ETL.
Si ninguna de las opciones de solución de problemas anteriores funciona, divide los datos de entrada en fragmentos o particiones. A continuación, ejecuta varios trabajos de ETL de AWS Glue en lugar de ejecutar un trabajo grande. Para obtener más información, consulta Partición de cargas de trabajo con ejecución limitada.
Información relacionada
Depuración de excepciones de memoria insuficiente e irregularidades relativas al trabajo
Prácticas recomendadas para escalar trabajos de Apache Spark y fragmentar datos con AWS Glue
Optimización de la administración de memoria en AWS Glue