Как рассчитывается / выделяется память для Spark на EMR? - PullRequest
0 голосов
/ 23 октября 2019

Я выполняю задания Spark на EMR с YARN и не понимаю, как подготовить и сообщить о памяти из пользовательских интерфейсов. У меня есть мастер и один экземпляр основного узла r4.8xlarge, который должен иметь 32 ядра и 244 ГБ памяти. Согласно этому doc , для него должно быть выделено 241 ГБ для YARN. Если посмотреть на интерфейс, это число составляет 236 ГБ, вероятно, из-за дополнительных издержек. Основываясь на рекомендациях , я настроил задание для следующих конфигураций:

- executor-cores 5 --executor-memory 35GB --num-executors 6 --conf spark.dynamicAllocation.enabled = false

Расчет для памяти исполнителя (236 ГБ / 6 исполнителей) * 0,9 = 35 ГБ

Когда я отправляю задание Spark и смотрю пользовательский интерфейс Spark или консоль для метрик исполнителя,цифры очень разные, и я не понимаю, как они рассчитываются и предоставляются. Вместо 6 исполнителей есть только 4, что приводит к тому, что задание использует только 20 ядер вместо доступных 30. Объем памяти для каждого исполнителя составляет 22,2 ГБ вместо 35 ГБ, что составляет всего 88 ГБ из общего количества 236 ГБ. .

Я посмотрел на многие ресурсы, но они говорят только о том, как настроить задания на спарк, установив настройки YARN и Spark, за которыми я следовал, но результаты неожиданные.

Может кто-нибудь помочь объяснить?

edit: в кластере установлены только приложения Spark и Hadoop.

enter image description here enter image description here enter image description here enter image description here

1 Ответ

2 голосов
/ 23 октября 2019

Память

Это связано с управлением искровой памятью.

Цитирование из From: https://www.tutorialdocs.com/article/spark-memory-management.html

По умолчанию Spark использует только память «в куче». Размер оперативной памяти настраивается параметром –executor-memory или spark.executor.memory при запуске приложения Spark. Параллельные задачи, выполняемые в Executor, совместно используют оперативную память JVM.

Область оперативной памяти в Executor можно условно разделить на следующие четыре блока:

Storage Memory: It's mainly used to store Spark cache data, such as RDD  
 cache, Broadcast variable, Unroll data, and so on.

Execution Memory: It's mainly used to store temporary data in the calculation 
 . process of Shuffle, Join, Sort, Aggregation, etc.

User Memory: It's mainly used to store the data needed for RDD conversion  
 operations, such as the information for RDD dependency.

Reserved Memory: The memory is reserved for system and is used to store 
Spark's internal objects.

https://0x0fff.com/spark-memory-management/

Доступная память, которую вы видите на приборной панели, составляет 75% от выделенной памяти.

Общий объем выделенной памяти для каждого исполнителя может варьироваться в зависимости от доступной памяти в узле. Точные 236 ГБ могут быть недоступны для пряжи. Процесс обработки данных и т. Д. Может занять больше памяти.

Память, которую вы видите, является памятью. Память хранения + память выполнения = 75% от общего объема выделенной памяти.

Для получения дополнительной информации:

  1. https://databricks.com/session/deep-dive-apache-spark-memory-management
  2. https://0x0fff.com/spark-memory-management/
  3. https://www.tutorialdocs.com/article/spark-memory-management.html

Количество исполнителей

Вам необходимо проверить yarn.nodemanager.resource.memory-mb в файле yarn-site.xml. Он обозначает «общую память, которую один NodeManager может выделить во всех контейнерах на одном узле». Это может быть случай, когда пряжа не дала всю доступную память в коробке. Поэтому искра не в состоянии договориться о 6 исполнителях.

Еще одна вещь spark.yarn.executor.memoryOverhead установлена ​​в 384 МБ на исполнителя, если она не переопределена. Это необходимо добавить в расчет.

Для получения дополнительной информации

  1. Apache Spark: установка экземпляров executor не меняет исполнителей

Как пользовательский интерфейс вычисляет память

  1. Как веб-интерфейс вычисляет объем памяти (на вкладке «Исполнители»)?
...