¿Cómo puedo resolver el error «java.lang.outOfMemoryError: espacio en el montón de Java» en un trabajo de AWS Glue Spark?

5 minutos de lectura
0

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

Información relacionada

Optimice la administración de memoria en AWS Glue

Lectura de archivos de entrada en grupos más grandes

Prácticas recomendadas para administrar correctamente la memoria de las aplicaciones Apache Spark en Amazon EMR

Supervisión de trabajos mediante la interfaz de usuario web de Apache Spark

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 años