AWS Builder Center: Learn, Build and Connect with builders in the AWS community
AWS Builder Center is the official home for builders on AWS. Share and read what others are working on, follow people who inspire you, explore training and workshops, and find tools to support what you're building.
¿Cómo puedo resolver el error "Container killed by YARN for exceeding memory limits" en Spark en Amazon EMR?
Quiero solucionar el error "Container killed by YARN for exceeding memory limits" en Spark en Amazon EMR.
Resolución
La causa principal y la solución adecuada para este error dependen de la carga de trabajo. Para solucionar el error, utiliza los siguientes métodos de solución de problemas, en el orden que se indica a continuación.
Aumento de la sobrecarga de memoria
La sobrecarga de memoria es la cantidad de memoria no almacenada asignada a cada ejecutor. De forma predeterminada, Spark establece la sobrecarga de memoria en el 10 % de la memoria del ejecutor o en 384, lo que sea mayor. Los búferes directos de Java NIO, las pilas de subprocesos, las bibliotecas nativas compartidas o los archivos asignados en memoria usan esta sobrecarga de memoria.
Aumenta gradualmente la sobrecarga de memoria, hasta un 25 %. La suma de la memoria del controlador o del ejecutor y la sobrecarga de memoria debe ser inferior al yarn.nodemanager.resource.memory-mb de tu 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 en el contenedor del ejecutor, aumenta la sobrecarga de memoria solo para el contenedor en el que se produjo el error. Puedes aumentar la sobrecarga de memoria en un clúster en ejecución, en un clúster nuevo o al enviar un trabajo.
Clúster en ejecución
Modifica 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
Clúster nuevo
Agrega un objeto de configuración similar al del siguiente ejemplo al iniciar el clúster:
[ { "Classification": "spark-defaults", "Properties": { "spark.driver.memoryOverhead": "512", "spark.executor.memoryOverhead": "512" } } ]
Trabajo único
Para aumentar la sobrecarga de memoria cuando ejecutes spark-submit, usa la opción --conf.
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 sigues recibiendo el error después de aumentar la sobrecarga de memoria, reduce la cantidad de núcleos ejecutores.
Reducción del número de núcleos ejecutores
Nota: Anula los cambios que hayas realizado en spark-defaults.conf en la sección anterior.
Al reducir el número de núcleos ejecutores, se reduce el número máximo de tareas que el ejecutor puede realizar, lo que reduce la cantidad de memoria necesaria. Dependiendo del contenedor del controlador que genere el error o del otro contenedor ejecutor que reciba el error, reduce la cantidad de núcleos para el controlador o el ejecutor.
Clúster en ejecución
Modifica spark-defaults.conf en el nodo maestro.
Ejemplo:
sudo vim /etc/spark/conf/spark-defaults.confspark.driver.cores 3 spark.executor.cores 3
Clúster nuevo
Agrega un objeto de configuración similar al del siguiente ejemplo al iniciar el clúster:
[ { "Classification": "spark-defaults", "Properties": {"spark.driver.cores" : "3", "spark.executor.cores": "3" } } ]
Trabajo único
Para reducir el número de núcleos ejecutores cuando ejecutes spark-submit, usa la opción —executor-cores.
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 sigues recibiendo el mensaje de error, aumenta el número de particiones.
Aumento del número de particiones
Nota: Anula los cambios que hayas realizado en spark-defaults.conf en la sección anterior.
Para aumentar el número de particiones, aumenta el valor de spark.default.parallelism para conjuntos de datos distribuidos resilientes sin procesar o ejecuta una operación .repartition().
Al aumentar el número de particiones, reduces la cantidad de memoria requerida por partición. Spark utiliza en gran medida la RAM del clúster como una forma eficaz de maximizar la velocidad. Por lo tanto, debes supervisar el uso de la memoria con Ganglia (para Amazon EMR versión 6.15) o el agente de Amazon CloudWatch (para Amazon EMR 7.0 y versiones posteriores). A continuación, verifica que la configuración del clúster y la estrategia de partición satisfagan tus crecientes necesidades de datos. Si sigue apareciendo el mensaje de error "Container killed by YARN for exceeding memory limits", aumenta la memoria del controlador y del ejecutor.
Aumento de la memoria del controlador y del ejecutor
Nota: Anula los cambios que hayas realizado en spark-defaults.conf en la sección anterior.
Si el error se produce en un contenedor de controladores o en un contenedor de ejecutores, aumenta la memoria del controlador o del ejecutor, pero no de ambos. Asegúrate 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 tu tipo de instancia de EC2:
"spark.driver/executor.memory + spark.driver/executor.memoryOverhead < yarn.nodemanager.resource.memory-mb"
Clúster en ejecución
Modifica spark-defaults.conf en el nodo maestro.
Ejemplo:
sudo vim /etc/spark/conf/spark-defaults.conf spark.executor.memory 1g spark.driver.memory 1g
Clúster nuevo
Agrega un objeto de configuración similar al siguiente al iniciar el clúster:
[ { "Classification": "spark-defaults", "Properties": { "spark.executor.memory": "1g", "spark.driver.memory":"1g", } } ]
Trabajo único
Usa las opciones --executor-memory y --driver-memory para aumentar la memoria cuando ejecutes spark-submit.
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
Otros pasos de resolución de problemas:
Si sigues recibiendo el mensaje de error, toma las siguientes medidas:
- Ejecuta la aplicación en un conjunto de datos de muestra. La evaluación comparativa es una práctica recomendada y puede ayudarte a detectar ralentizaciones y particiones sesgadas que provocan problemas de memoria.
- Procesa la cantidad mínima de datos requerida. Si no filtras los datos, o si los filtras 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.
- Divide tus datos solo se ingieran los datos necesarios.
- Usa una estrategia de particionado diferente. Por ejemplo, realiza particiones en una clave alternativa para evitar particiones grandes y particiones sesgadas.
- Es posible que la instancia de EC2 no tenga los recursos de memoria necesarios para la carga de trabajo. Cambia a un tipo de instancia más grande y con optimización de memoria. Si sigues recibiendo excepciones de memoria después de cambiar los tipos de instancia, prueba los métodos de solución de problemas en la nueva instancia.
Información relacionada
Spark configuration (Configuración de Spark) en el sitio web de Apache Spark
¿Cómo puedo solucionar el error "java.lang.ClassNotFoundException" de Spark en Amazon EMR?
- Temas
- Analytics
- Etiquetas
- Amazon EMR
- Idioma
- Español

Contenido relevante
preguntada hace 22 días
preguntada hace un año