#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.
Дополнительный ресурс поток рассылки 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
. Вы можете подтвердить?