Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Por qué se elimina Spark on Yarn cuando la memoria excede los límites del contenedor?

¿Por qué se elimina Spark on Yarn cuando la memoria excede los límites del contenedor?

Un Ejecutor es equivalente a un proceso JVM. Desde la perspectiva de Spark, la memoria ocupada por Executor se divide en dos partes: ExecutorMemory y MemoryOverhead. ExecutorMemory es el área del montón de Java del proceso JVM, y MemoryOverhead es el espacio fuera del montón de Java ocupado por el proceso JVM, incluido el área de método (generada permanentemente), la pila de la máquina virtual Java, la pila de métodos locales y la memoria utilizada por Proceso JVM en sí y memoria fuera del montón (memoria directa).

spark.driver.memory y spark.executor.memory configuran ExecutorMemory para el controlador y el ejecutor de Spark respectivamente.

spark.yarn.executor.memoryOverhead y spark.yarn.driver.memoryOverhead configuran la sobrecarga de memoria del controlador y ejecutor Spark respectivamente.

Además, Spark asigna una gran cantidad de memoria fuera del montón, y la memoria fuera del montón máxima predeterminada puede ser la misma que ExecutorMemory, que se puede configurar a través de javaOptions usando MaxDirectMemorySize.

El tamaño máximo de la memoria fuera del montón es el mismo que el de ExecutorMemory, pero la memoria fuera del montón está limitada por MemoryOverhead, por lo que cuando MaxDirectMemorySize, ExecutorMemory y MemoryOverhead se configuran incorrectamente, el contenedor se sobrecargará con la memoria. y asesinado por Yarn.

Por ejemplo, si ExecutorMemory es 8G, MemoryOverhead es 4G y MaxDirectMemorySize no está configurado, entonces Yarn cree que el contenedor puede usar hasta 12G de memoria, pero la memoria fuera del montón es de hasta 8G. lo que hace que el contenedor utilice más de 16G de memoria. Esto da como resultado que el contenedor pueda usar más de 16 G de memoria (dentro del montón + fuera del montón), más de 12 G y, finalmente, Yarn lo elimine.

Una regla de configuración razonable debe ser ExecutorMemory + MemoryOverhead > ExecutorMemory + MaxDirectMemorySize

Por lo tanto, el tamaño total de la memoria del clúster utilizada por las aplicaciones Spark es:

Parámetros recomendados Ajustes:

Cada proceso Ejecutor puede utilizar más de 16 G de memoria (dentro del montón + fuera del montón).

Es más apropiado configurar una memoria de 4G ~ 8G para cada proceso Ejecutor.

El número de núcleos de CPU para cada Ejecutor se establece entre 2 y 4.

Las siguientes son algunas configuraciones de parámetros recomendadas:

El número de núcleos de CPU para cada proceso Ejecutor debe establecerse entre 2 y 4.