Как Spark, работающий на YARN, учитывает использование памяти Python?

#python #apache-spark #hadoop #pyspark #hadoop-yarn

#python #apache-spark #hadoop #pyspark #hadoop-yarn

Вопрос:

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

Учитывается ли это spark.executor.memory spark.executor.memoryOverhead или где?

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

Ответ №1:

Я бы попытался увеличить объем памяти до 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 Кредиты изображения

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

Комментарии:

1. @mr-srinivas spark.python.worker.memory рассказывает о памяти, используемой во время агрегации . Как насчет того, когда ничего не агрегируется, например, на этапе простой карты?

2. @domkck: ввод-вывод в Spark будет выполняться только JVM (см. Изображение), и данные будут перемещены в процессы Python через канал для агрегирования. Пожалуйста, проверьте обновленный ответ, и я не был уверен, как я пропустил ваш вопрос до сих пор.

3. @mrsrinivas Я использую pyspark для извлечения функций, использую оператор combineByKey и использую spark.python.worker.memory настройку по умолчанию, но рабочий процесс python использует около 10 гб памяти, а yarn уничтожил контейнер. Почему spark.python.worker.memory настройка не работает? Можете ли вы показать мне какую-нибудь ссылку для профилирования рабочей памяти python? Большое спасибо

4. Ответ по-прежнему кажется немного неясным. Если spark.python.worker.memory не учитывается (т.Е. подмножество) spark.executor.memory , Является ли это частью spark.yarn.executor.memoryOverhead then? spark.python.worker.memory явно находится вне кучи, и YARN уничтожает контейнер, если spark.executor.memory spark.yarn.executor.memoryOverhead > yarn.nodemanager.resource.memory-mb . Это, по-видимому, предполагает, что spark.python.worker.memory это должно быть учтено в spark.yarn.executor.memoryOverhead . Вы можете подтвердить?