#apache-spark #pyspark #hadoop-yarn #executor #memory-overhead
#apache-spark #pyspark #hadoop-yarn #исполнитель #служебная память-служебные данные
Вопрос:
Вопрос, связанный с накладными расходами на память Spark, задавался несколько раз в SO, я просмотрел большинство из них. Однако, просмотрев несколько блогов, я запутался.
Ниже приведены вопросы, которые у меня есть
- является ли служебная память частью памяти исполнителя или она отдельная? Поскольку немногие из блогов говорят, что накладные расходы на память являются частью памяти исполнителя, а другие говорят, что память исполнителя накладные расходы на память (означает ли это, что накладные расходы на память не являются частью памяти исполнителя)?
- Накладные расходы на память и перегрузка вне кучи одинаковы?
- Что произойдет, если я не упомянул накладные расходы как часть отправки spark, будет ли по умолчанию 18,75 или нет?
- Будут ли какие-либо побочные эффекты, если мы предоставим больше накладных расходов на память, чем значение по умолчанию?
https://docs.qubole.com/en/latest/user-guide/engines/spark/defaults-executors.html
https://spoddutur.github.io/spark-notes/distribution_of_executors_cores_and_memory_for_spark_application.html
Ниже приведен случай, который я хочу понять. У меня есть 5 узлов с каждым узлом по 16 vcores и 128 ГБ памяти (из которых 120 можно использовать), теперь я хочу отправить приложение spark, ниже приведен conf, я думаю
Total Cores 16 * 5 = 80
Total Memory 120 * 5 = 600GB
случай 1: Служебная память — часть памяти исполнителя
spark.executor.memory=32G
spark.executor.cores=5
spark.executor.instances=14 (1 for AM)
spark.executor.memoryOverhead=8G ( giving more than 18.75% which is default)
spark.driver.memoryOverhead=8G
spark.driver.cores=5
Случай 2: служебная память, не являющаяся частью памяти исполнителя
spark.executor.memory=28G
spark.executor.cores=5
spark.executor.instances=14 (1 for AM)
spark.executor.memoryOverhead=6G ( giving more than 18.75% which is default)
spark.driver.memoryOverhead=6G
spark.driver.cores=5
Согласно приведенному ниже видео, я пытаюсь использовать 85% узла, то есть около 100 ГБ из 120 ГБ, не уверен, сможем ли мы использовать больше.
Комментарии:
1. является ли служебная память частью памяти исполнителя или она отдельная? ДА… в диспетчере ресурсов запускает контейнеры для выполнения исполнителей внутри этого. таким образом, в основном память исполнителя служебная память = память контейнера ….. у spark есть сбой для памяти исполнителя в памяти приложения и кэш-памяти
2. служебная память исполнителя включает в себя оперативную память и буферы, а также память для запуска потоков, специфичных для контейнера.
3. Что произойдет, если я не упомянул накладные расходы как часть отправки spark, будет ли это использоваться по умолчанию… Диспетчер ресурсов вычисляет значение служебной памяти, используя значения по умолчанию, если они не указаны явно.
4. Общее количество ядер 16 * 5 = 80 Общая память 120 * 5 = 600 ГБ …… вы всегда должны оставлять в стороне ядра и память для ОС, которая работает на этом узле, и 1 ядро для nodemanager и 1 ядро для других демонов и 2 ядра для оптимальной работы ОС
5. предполагая, что 12 * 5 = 60, а общая память 116 * 5 = 580 ГБ — это общие доступные ресурсы .. затем вы настраиваете другие параметры соответствующим образом…
Ответ №1:
Чтобы ответить на ваш вопрос, является ли служебная память частью памяти исполнителя или она отдельная? Служебная память не является частью памяти исполнителя.
Диспетчер ресурсов запускает контейнеры для выполнения исполнителей внутри него. таким образом, в основном память исполнителя служебная память = память контейнера ….. искра разделила память исполнителя на память приложений и кэш-память.
Служебная память исполнителя в основном включает в себя память вне кучи и буферы nio, а также память для запуска потоков, специфичных для контейнера (стеки потоков). когда вы не указываете служебную память, Resource Manager вычисляет значение служебной памяти, используя значения по умолчанию, и соответственно запускает контейнеры.
Всегда рекомендуется не использовать ядра и память для ОС (то есть 1 ядро для nodemanager и 1 ядро для других демонов и 2 ядра для оптимальной работы ОС)
Вы можете изменить свой расчет, как указано ниже, 12 * 5 = 60 ядер, а общая память 116 * 5 = 580 ГБ — это то, какие общие доступные ресурсы .. затем вы соответствующим образом настраиваете другие параметры.
Комментарии:
1. служебная память исполнителя не включает память вне кучи в 3.x . Из документации: «Максимальный размер памяти контейнера для запущенного исполнителя определяется суммой spark.executor.memoryOverhead, spark.executor.memory, spark.memory.offHeap.size и spark.executor.pyspark.memory».