¿Cómo puedo resolver el error «java.lang.outOfMemoryError: espacio en el montón de Java» en un trabajo de AWS Glue Spark?
Mi trabajo de AWS Glue falla y aparece el mensaje «Error de comando con el código de salida 1». Los registros de Amazon CloudWatch muestran el error «java.lang.outOfMemory: espacio en el montón de Java».
Descripción breve
El error «java.lang.outOfMemoryError: espacio en el montón de Java» indica que un controlador o ejecutor se está quedando sin memoria de JVM. Para determinar si un controlador o un ejecutor provocan la OOM, consulte Depuración de excepciones de OOM y anomalías en el trabajo.
Nota: La siguiente resolución es solo para las excepciones de OOM del controlador.
Las excepciones de OOM del controlador se deben a lo siguiente:
- El trabajo de Spark de AWS Glue lee una gran cantidad de archivos pequeños de Amazon Simple Storage Service (Amazon S3)
- Operaciones con uso intensivo de controladores, como collect(), Broadcast Joins y Shared variable
Resolución
Resuelva las excepciones de OOM del controlador causadas por una gran cantidad de archivos pequeños
Para resolver las excepciones de OOM del controlador causadas por una gran cantidad de archivos pequeños con DynamicFrames, utilice uno o más de los siguientes métodos.
Activar useS3ListImplementation
Cuando enumera los archivos, AWS Glue crea un índice de archivos en las listas de memoria del controlador. Cuando establece useS3ListImplementation en True, AWS Glue no almacena en caché la lista de archivos de la memoria de una sola vez. En su lugar, AWS Glue almacena la lista en lotes. Esto significa que es menos probable que el controlador se quede sin memoria.
Consulte el siguiente ejemplo de cómo activar useS3ListImplementation con from_catalog:
datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "database", table_name = "table", additional_options = {'useS3ListImplementation': True}, transformation_ctx = "datasource0")
Consulte el siguiente ejemplo que activa Uses3ListImplementation con from_options:
datasource0 = glueContext.create_dynamic_frame.from_options(connection_type="s3", connection_options = {"paths": ["s3://input_path"], "useS3ListImplementation":True,"recurse":True}, format="json")
La función useS3ListImplementation es una implementación de la operación ListKeys de Amazon S3. Esto divide los conjuntos de resultados grandes en varias respuestas. Se recomienda utilizar useS3ListImplementation con marcadores de trabajo.
Agrupación
Una aplicación de Spark procesa cada archivo pequeño mediante una tarea de Spark diferente. Esto puede generar OOM porque el controlador almacena y realiza un seguimiento de la ubicación y la información de la tarea. Al activar la función de agrupamiento, las tareas procesan un grupo de varios archivos en lugar de archivos individuales. La agrupación se activa automáticamente cuando se utilizan marcos dinámicos y cuando el conjunto de datos de Amazon S3 tiene más de 50 000 archivos. Para obtener más información, consulte Lectura de archivos de entrada en grupos más grandes.
Filtrado con predicados push down
Reduzca la cantidad de archivos de Amazon S3 y particiones de Amazon S3 que lee el trabajo de AWS Glue mediante predicados push down. Esto elimina las particiones innecesarias de la tabla de AWS Glue antes de leer los datos subyacentes. Para obtener más información, consulte Prefiltrado mediante predicados push down.
Excepciones de OOM del controlador causadas por operaciones intensivas del controlador
Resuelva las excepciones de OOM del controlador causadas por operaciones intensivas del controlador mediante uno de los siguientes métodos.
Tenga en cuenta las operaciones con uso intensivo de controladores
collect() es una operación de Spark que recopila los resultados de los trabajadores y, a continuación, los devuelve al controlador como un único objeto. Los resultados pueden ser muy grandes y eso sobrecarga el controlador. De forma predeterminada, la configuración de Spark spark.driver.maxResultSize está configurada en 1 GB y ayuda a evitar que el controlador se sobrecargue.
Por lo tanto, limite estas acciones y, en su lugar, utilice acciones como take(), takeSample() o isEmpty() siempre que sea posible.
Además, tenga en cuenta que las uniones de difusión en Spark pueden provocar errores de OOM si la relación (tabla) supera la memoria disponible del controlador. Antes de que una relación se difunda a los ejecutores, se materializa en el nodo del controlador. Si se están difundiendo varias tablas o la relación es demasiado grande, es posible que el controlador tenga escasez de memoria. Use las configuraciones de Spark spark.sql.autoBroadcastJoinThreshold y Spark Join Hints para controlar esto.
Destruya regularmente las variables compartidas
Asegúrese de utilizar las variables compartidas con cuidado. Destruya las variables compartidas cuando ya no las necesite, ya que pueden provocar excepciones de OOM en el controlador de Spark. Hay dos tipos de variables compartidas: variables de difusión y acumuladores.
- Las variables de difusión son datos de solo lectura que se envían a los ejecutores solo una vez. Son una buena solución para almacenar datos de referencia inmutables, como diccionarios pequeños o tablas pequeñas compartidas entre todos los ejecutores.
- Los acumuladores proporcionan una copia que se puede escribir en todos los ejecutores de Spark y se pueden usar para implementar contadores distribuidos (como en MapReduce) o sumas.
Solución de problemas adicionales
- Analice su conjunto de datos y seleccione el tipo de trabajador adecuado para su trabajo. Considere la posibilidad de escalar a G.1X o G.2X.
- Utilice los registros de CloudWatch y las métricas de CloudWatch para analizar la memoria del controlador. Configure las alarmas de CloudWatch para que le avisen cuando se superen umbrales específicos en su trabajo.
- Active la interfaz de usuario de Spark para su trabajo en AWS Glue y consulte los registros de eventos de Spark para entender por qué se produce la OOM. Para obtener más información, consulte Supervisión de trabajos mediante la interfaz de usuario web de Apache Spark.
Información relacionada
Optimice la administración de memoria en AWS Glue
Lectura de archivos de entrada en grupos más grandes
Supervisión de trabajos mediante la interfaz de usuario web de Apache Spark
Contenido relevante
- OFICIAL DE AWSActualizada hace 3 meses
- ¿Cómo puedo resolver el error «No queda espacio en el dispositivo» en un trabajo de ETL de AWS Glue?OFICIAL DE AWSActualizada hace 2 años
- OFICIAL DE AWSActualizada hace 3 años
- OFICIAL DE AWSActualizada hace 3 años