¿Cómo puedo resolver el error «No queda espacio en el dispositivo» en un trabajo de ETL de AWS Glue?

6 minutos de lectura
0

Quiero evitar que aparezca el error «No queda espacio en el dispositivo» cuando ejecuto un trabajo de ETL de AWS Glue.

Descripción breve

Es posible que reciba los siguientes tipos de errores al ejecutar un trabajo de extracción, transformación y carga (ETL) de AWS Glue:

  • Trabajo cancelado debido a un error de fase: La tarea 68 de la etapa 158.0 falló 4 veces, el error más reciente: Se perdió la tarea 68.3 en la etapa 158.0 (TID 28820, 10.102.100.111, ejecutor 17): org.apache.spark.memory.SparkOutOfMemoryError: error while calling spill() on org.apache.spark.shuffle.sort.ShuffleExternalSorter@55f6dabb: No queda espacio en el dispositivo

        -o-

  • Trabajo cancelado debido a un error de fase: ResultStage 7 no ha superado el número máximo permitido de veces: 4. Motivo de error más reciente: org.apache.spark.shuffle.MetadataFetchFailedException: Falta una ubicación de salida para shuffle 2

Apache Spark utiliza el disco local de los trabajadores de AWS Glue para eliminar datos de la memoria que superen el espacio de almacenamiento definido en el parámetro de configuración spark.executor.memory.

Las transformaciones amplias, como groupByKey(), reduceByKey(), y join() pueden provocar una confusión. Durante la fase de clasificación o mezcla aleatoria del trabajo, Spark escribe los datos intermedios en un disco local antes de poder intercambiarlos entre los distintos trabajadores. En este punto, es posible que aparezca el mensaje «No queda espacio en el dispositivo» o un error MetadataFetchFailedException. Spark emite este error cuando no queda suficiente espacio en disco en el ejecutor y no hay recuperación.

Resolución

Este tipo de errores suelen producirse cuando el trabajo de procesamiento observa un sesgo significativo en el conjunto de datos. En esta sección se enumeran algunas de las anomalías comunes de monitorización y depuración y las formas en que puede abordarlas.

Las métricas de trabajo de AWS Glue y la interfaz de usuario de Apache Spark son herramientas poderosas para monitorear el sesgo de los datos en los ejecutores de Apache Spark. Al supervisar el cronograma de implementación, la herramienta le permite identificar fácilmente cualquier problema que pueda provocar un sesgo en los datos. Le ayuda a comprender en detalle el comportamiento de cada etapa, tarea, trabajo y ejecutor.

Desagregue la computación y el almacenamiento

Este enfoque escala el almacenamiento para grandes cantidades en lugar de escribir los datos en el disco local de los trabajadores de AWS Glue.

Utilice almacenamiento dedicado sin servidor: AWS Glue 2.0 o superior le permite usar Amazon Simple Storage Service (Amazon S3) para almacenar datos aleatorizados y dispersos de Spark.

AWS Glue 2.0 Utilice los siguientes parámetros de trabajo para usar Amazon S3 shuffle en AWS Glue. Para obtener más información, consulte el complemento AWS Glue Spark shuffle con Amazon S3.

  • Clave: --write-shuffle-files-to-s3
    Valor: TRUE
  • Clave: --write-shuffle-spills-to-s3
    Valor: TRUE
  • Clave: --conf
    Valor: spark.shuffle.glue.s3ShuffleBucket=s3://custom_shuffle_bucket
    Nota: El indicador opcional spark.shuffle.glue.s3ShuffleBucket especifica el bucket de Amazon S3 en el que se escriben los archivos aleatorizados. Sustituya custom_shuffle_bucket por el nombre de su bucket de S3.

AWS Glue 3.0/4.0 Utilice los siguientes parámetros de trabajo para utilizar el complemento de almacenamiento aleatorio en la nube para Apache Spark. Para obtener más información, consulte el complemento de almacenamiento aleatorio en la nube para Apache Spark.

  • Clave: --write-shuffle-files-to-s3
    Valor: TRUE
  • Clave: --conf
    Valor: spark.shuffle.storage.path=s3://custom_shuffle_bucket
    Nota: El indicador opcional spark.shuffle.storage.path especifica el bucket de Amazon S3 en el que se escriben los archivos aleatorizados. Sustituya custom_shuffle_bucket por el nombre de su bucket de S3.

Escalación

La escalación horizontal se refiere a aumentar el número de trabajadores mediante la escalación horizontal o a actualizar el tipo de trabajador mediante la escalación vertical. Sin embargo, es posible que la escalación horizontal no siempre funcione, especialmente si los datos están muy sesgados en algunas teclas. Para corregir el sesgo de los datos, considere la posibilidad de modificar la lógica de la aplicación Apache Spark mediante la implementación de la técnica de salazón.

Reducir y filtrar los datos de entrada

Filtre previamente los datos de entrada en la medida de lo posible para minimizar la mezcla aleatoria de datos y el uso de la red durante operaciones amplias. Utilice las siguientes técnicas para un filtrado de datos eficaz:

Difunde tablas pequeñas

La unión de tablas en Apache Spark puede provocar la mezcla de datos y el movimiento de enormes cantidades de datos entre los ejecutores de diferentes trabajadores. Esto puede provocar que el sistema se quede sin memoria y que los datos se derramen en el disco del trabajador. Para minimizar la sobrecarga de la red, Spark admite el uso de tablas más pequeñas para la difusión. Estas tablas no superan las decenas de MB (megabytes) y evitan la partición y la mezcla aleatoria de datos. Use una tabla más pequeña para transmitir proporcionando una pista a Spark. Para obtener más información, consulte Difundir tablas pequeñas en el blog de AWS Optimice la administración de memoria en AWS Glue.

Utilice AQE

La ejecución adaptativa de consultas (AQE) de Databricks es una técnica de optimización en Spark SQL. Utilice estadísticas de tiempo de ejecución para elegir el plan de implementación de consultas más eficiente a fin de resolver el sesgo de los datos y las particiones aleatorias dinámicas en cada etapa. AQE está disponible de forma predeterminada en AWS Glue 3.0/4.0.

AQE desempeña las siguientes funciones:

  • Fusiona dinámicamente particiones aleatorias
    Reúna automáticamente las particiones, si es necesario, después de cada etapa de consulta y resuelva los problemas de administración de particiones. Para obtener más información, consulte Coalescencia dinámica de particiones aleatorias en Adaptive Query Execution: Acelerar Spark SQL at Runtime en el sitio web de Databricks.
    –Muy pocas particiones: Divide automáticamente las particiones con exceso de datos que provocan una fuga en el disco local.
    –Demasiadas particiones: Combina particiones automáticamente, según sea necesario. Las particiones se combinan cuando el tamaño de los datos de cada partición es pequeño y se requieren pequeñas búsquedas de datos de red para leer los bloques aleatorios.

  • Cambia dinámicamente las estrategias de unión
    Convierte Sort-Merge en Broadcast Hash Join, según las estadísticas del tamaño de la tabla de cada etapa.

  • Optimiza dinámicamente las uniones sesgadas
    Detecta y optimiza automáticamente la unión sesgada a partir de las estadísticas de archivos aleatorizados. AQE divide las particiones sesgadas en subparticiones más pequeñas. A continuación, une estas particiones más pequeñas a la partición correspondiente del otro nodo. Para obtener más información, consulte Optimización dinámica de uniones sesgadas en Adaptive Query Execution: Acelerar Spark SQL at Runtime en el sitio web de Databricks.

Configurar AQE

Utilice los siguientes parámetros de trabajo para activar AQE:

  • Clave: --conf
    Valor: spark.sql.adaptive.enabled=true --conf spark.sql.adaptive.coalescePartitions.enabled=true --conf spark.sql.adaptive.skewJoin.enabled=true
OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año