¿Cómo se ejecuta Spark en la cuenta YARN para el uso de memoria de Python?

Después de leer la documentación, no entiendo cómo se ejecuta Spark en la cuenta YARN para el consumo de memoria de Python.

¿Cuenta para spark.executor.memory , spark.executor.memoryOverhead o dónde?

En particular, tengo una aplicación PySpark con spark.executor.memory=25G , spark.executor.cores=4 y me encuentro con un contenedor frecuente eliminado por YARN por exceder los límites de memoria. errores al ejecutar un map en un RDD. Opera en una cantidad bastante grande de objetos de Python complejos, por lo que se espera que ocupe una cantidad no trivial de memoria, pero no 25GB. ¿Cómo debo configurar las diferentes variables de memoria para usar con el código Python pesado?

Intentaría boost la memoria a la predeterminada de spark.python.worker.memory ( 512m ) debido al pesado código de Python y este valor de propiedad no cuenta en spark.executor.memory .

Cantidad de memoria a usar por cada proceso de trabajo de python durante la agregación, en el mismo formato que las cadenas de memoria JVM (por ejemplo, 512m, 2g). Si la memoria utilizada durante la agregación supera esta cantidad, dertwigrá los datos en discos . enlazar

Cálculo de ExecutorMemoryOverhead en Spark:

 MEMORY_OVERHEAD_FRACTION = 0.10 MEMORY_OVERHEAD_MINIMUM = 384 val executorMemoryOverhead = max(MEMORY_OVERHEAD_FRACTION * ${spark.executor.memory}, MEMORY_OVERHEAD_MINIMUM)) 

La propiedad es spark.{yarn|mesos}.executor.memoryOverhead para YARN y Mesos.

YARN elimina los procesos que toman más memoria de la que solicitaron, que es la sum de executorMemoryOverhead y executorMemory .

En la imagen dada, los procesos de python en worker utilizan spark.python.worker.memory , y luego spark.yarn.executor.memoryOverhead + spark.executor.memory es JVM específico.

Internos de PySpark Creditos de la imagen

Recurso adicional hilo de correo Apache