¿Cómo puedo resolver el error «Container killed by YARN for exceeding memory limits» en Spark en Amazon EMR?

6 minutos de lectura
0

Quiero solucionar el error «Container killed by YARN for exceeding memory limits» en Spark en Amazon EMR.

Descripción breve

Utilice uno de los métodos siguientes para resolver este error:

  • Aumentar la sobrecarga de memoria.
  • Reducir la cantidad de núcleos ejecutores.
  • Aumentar el número de particiones.
  • Aumentar la memoria del controlador y del ejecutor.

Resolución

La causa principal y la solución adecuada para este error dependen de la carga de trabajo. Puede que tenga que probar cada uno de los métodos siguientes, en el orden siguiente, para solucionar el error. Antes de continuar con el siguiente método de esta secuencia, anule los cambios que haya realizado en spark-defaults.conf en la sección anterior.

Aumento de la sobrecarga de memoria

La sobrecarga de memoria es la cantidad de memoria no almacenada asignada a cada ejecutor. De forma predeterminada, la sobrecarga de memoria se establece en el 10 % de la memoria del ejecutor o en 384, lo que sea mayor. La sobrecarga de memoria se utiliza para los búferes directos de Java NIO, las pilas de subprocesos, las bibliotecas nativas compartidas o los archivos mapeados en memoria.

Considere aumentar gradualmente la sobrecarga de memoria, hasta un 25 %. La suma de la memoria del controlador o del ejecutor más la sobrecarga de memoria debe ser inferior al yarn.nodemanager.resource.memory-mb del tipo de instancia.

spark.driver/executor.memory + spark.driver/executor.memoryOverhead < yarn.nodemanager.resource.memory-mb

Si el error se produce en el contenedor del controlador o del ejecutor, considere aumentar la sobrecarga de memoria únicamente para ese contenedor. Puede aumentar la sobrecarga de memoria mientras se ejecuta el clúster, cuando lanza un nuevo clúster o cuando envía un trabajo.

En un clúster en ejecución:

Modifique spark-defaults.conf en el nodo maestro.

Por ejemplo:

sudo vim /etc/spark/conf/spark-defaults.conf

spark.driver.memoryOverhead 512
spark.executor.memoryOverhead 512

En un clúster nuevo:

Agregue un objeto de configuración similar al siguiente al lanzar un clúster:

[
  {
    "Classification": "spark-defaults",
    "Properties": {
      "spark.driver.memoryOverhead": "512",
      "spark.executor.memoryOverhead": "512"
    }
  }
]

Para un solo trabajo:

Use la opción --conf para aumentar la sobrecarga de memoria cuando ejecute spark-submit.

Por ejemplo:

spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --conf spark.driver.memoryOverhead=512 --conf spark.executor.memoryOverhead=512 /usr/lib/spark/examples/jars/spark-examples.jar 100

Si aumentar la sobrecarga de memoria no resuelve el problema, reduzca la cantidad de núcleos ejecutores.

Reducción de la cantidad de núcleos ejecutores

Esto reduce el número máximo de tareas que puede realizar el ejecutor, lo que reduce la cantidad de memoria necesaria. Dependiendo del contenedor del controlador que genere este error o del otro contenedor ejecutor que reciba este error, considere reducir los núcleos del controlador o del ejecutor.

En un clúster en ejecución:

Modifique spark-defaults.conf en el nodo maestro.

Por ejemplo:

sudo vim /etc/spark/conf/spark-defaults.conf
spark.driver.cores  3
spark.executor.cores  3

En un clúster nuevo:

Agregue un objeto de configuración similar al siguiente al lanzar un clúster:

[
  {
    "Classification": "spark-defaults",
    "Properties": {"spark.driver.cores" : "3",
      "spark.executor.cores": "3"
    }
  }
]

Para un solo trabajo:

Use la opción --executor-cores para reducir el número de núcleos ejecutores cuando ejecute spark-submit.

Por ejemplo:

spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --executor-cores 3 --driver-cores 3 /usr/lib/spark/examples/jars/spark-examples.jar 100

Si sigue apareciendo el mensaje de error, aumente el número de particiones.

Aumento del número de particiones

Para aumentar el número de particiones, aumente el valor de spark.default.parallelism para conjuntos de datos distribuidos resilientes sin procesar o ejecute una operación .repartition(). El aumento del número de particiones reduce la cantidad de memoria necesaria por partición. Spark utiliza en gran medida la RAM del clúster como una forma eficaz de maximizar la velocidad. Por lo tanto, debe supervisar el uso de la memoria con Ganglia, y, a continuación, comprobar que la configuración del clúster y la estrategia de particionamiento satisfacen sus crecientes necesidades de datos. Si sigue apareciendo el mensaje de error «Container killed by YARN for exceeding memory limits», aumente la memoria del controlador y del ejecutor.

Aumento de la memoria del controlador y del ejecutor

Si el error se produce en un contenedor de controladores o en un contenedor de ejecutores, considere aumentar la memoria del controlador o del ejecutor, pero no de ambos. Asegúrese de que la suma de la memoria del controlador o del ejecutor más la sobrecarga de memoria del controlador o del ejecutor sea siempre inferior al valor de yarn.nodemanager.resource.memory-mb para su tipo de instancia de EC2:

spark.driver/executor.memory + spark.driver/executor.memoryOverhead < yarn.nodemanager.resource.memory-mb

En un clúster en ejecución:

Modifique spark-defaults.conf en el nodo maestro.

Ejemplo:

sudo vim /etc/spark/conf/spark-defaults.conf

spark.executor.memory  1g
spark.driver.memory  1g

En un clúster nuevo:

Agregue un objeto de configuración similar al siguiente al lanzar un clúster:

[
  {
    "Classification": "spark-defaults",
    "Properties": {
      "spark.executor.memory": "1g",
      "spark.driver.memory":"1g",
    }
  }
]

Para un solo trabajo:

Use las opciones --executor-memory y --driver-memory para aumentar la memoria cuando ejecute spark-submit.

Por ejemplo:

spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --executor-memory 1g --driver-memory 1g /usr/lib/spark/examples/jars/spark-examples.jar 100

Otras opciones de solución

Si sigue apareciendo el mensaje de error, pruebe lo siguiente:

  • Evaluación comparativa: Se recomienda ejecutar la aplicación en un conjunto de datos de muestra. Hacerlo puede ayudarle a detectar ralentizaciones y particiones sesgadas que pueden provocar problemas de memoria.
  • Filtración de datos: Asegúrese de procesar la cantidad mínima de datos. Si no filtra los datos, o si los filtra al final de la ejecución de la aplicación, el exceso de datos podría ralentizar la aplicación. Esto puede aumentar la probabilidad de que se produzca una excepción de memoria.
  • Tamaño del conjunto de datos: Se recomienda procesar los datos mínimos requeridos. Divida sus datos para que solo se ingieran los datos necesarios.
  • Estrategia de particionado: Considere la posibilidad de utilizar una estrategia de particionado diferente. Por ejemplo, realice particiones en una clave alternativa para evitar particiones grandes y particiones sesgadas.
  • Tipo de instancia EC2: Es posible que la instancia de EC2 no tenga los recursos de memoria necesarios para la carga de trabajo. Cambiar a un tipo de instancia optimizado para memoria más grande podría resolver el error. Si sigue recibiendo excepciones de memoria después de cambiar los tipos de instancia, pruebe los métodos de solución de problemas en la nueva instancia.

Información relacionada

Configuración de Spark

¿Cómo puedo solucionar el error «java.lang.classNotFoundException» de Spark en Amazon EMR?

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año