Как Spark работает в YARN для использования памяти Python?

После прочтения документации я не понимаю, как Spark работает в YARN для учета потребления памяти Python.

Рассчитывает ли он spark.executor.memory, spark.executor.memoryOverhead или где?

В частности, у меня есть приложение PySpark с spark.executor.memory=25G, spark.executor.cores=4, и я сталкиваюсь с частым контейнером , убитым YARN, для превышения ограничений памяти. при запуске map на RDD. Он работает на довольно большом количестве сложных объектов Python, поэтому ожидается, что он займет некоторое нетривиальное количество памяти, но не 25 ГБ. Как настроить различные переменные памяти для использования с тяжелым кодом Python?

Ответы

Ответ 1

Я бы попытался увеличить память до spark.python.worker.memory умолчанию для spark.python.worker.memory (512 м) из-за тяжелого кода Python, и это значение свойства не учитывается в spark.executor.memory.

Объем памяти, который будет использоваться каждым рабочим процессом Python во время агрегации, в том же формате, что и строки памяти JVM (например, 512m, 2g). Если объем памяти, используемой во время агрегации, превысит этот объем, данные будут разбросаны по дискам. ссылка на сайт

ExecutorMemoryOverhead расчета в Spark:

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

Свойство является spark.{yarn|mesos}.executor.memoryOverhead для YARN и Mesos.

YARN убивает процессы, которые занимают больше памяти, чем они запрашивали, что является суммой executorMemoryOverhead и executorMemory.

В данном изображении процессы Python в работнике используют spark.python.worker.memory, а затем spark.yarn.executor.memoryOverhead + spark.executor.memory является специфической JVM.

PySpark Internals Изображение предоставлено

Дополнительный ресурс почтовой рассылки Apache