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

У меня есть приложение Apache Spark, работающее в кластере YARN (в этом кластере есть три узла), в режиме кластера.

Когда приложение работает, Spark-UI показывает, что 2 исполнителя (каждый работает на своем узле) и драйвер работают на третьем узле. Я хочу, чтобы приложение использовало больше исполнителей, поэтому я попытался добавить аргумент --num-executors к Spark-submit и установить его равным 6.

spark-submit --driver-memory 3G --num-executors 6 --class main.Application --executor-memory 11G --master yarn-cluster myJar.jar <arg1> <arg2> <arg3> ...

Однако количество исполнителей остается 2.

В интерфейсе spark я вижу, что параметр spark.executor.instances равен 6, как я и предполагал, и почему-то осталось только 2 исполнителя.

Я даже пытался установить этот параметр из кода

sparkConf.set("spark.executor.instances", "6")

Опять же, я вижу, что параметр был установлен на 6, но все еще есть только 2 исполнителя.

Кто-нибудь знает, почему я не смог увеличить количество своих исполнителей?

yarn.nodemanager.resource.memory-mb составляет 12 г в yarn-site.xml

4 ответа

Решение

Увеличение yarn.nodemanager.resource.memory-mb в yarn-site.xml

С 12g на узел вы можете запустить только драйвер (3g) и 2 исполнителя (11g).

Node1 - драйвер 3g (+7% накладных расходов)

Node2 - executor1 11g (+ 7% накладных расходов)

Node3 - executor2 11g (+ 7% накладных расходов)

Теперь вы запрашиваете executor3 из 11g, и ни на одном узле не доступно 11g памяти.

для 7% накладных расходов обратитесь к spark.yarn.executor.memoryOverhead и spark.yarn.driver.memoryOverhead в https://spark.apache.org/docs/1.2.0/running-on-yarn.html

Обратите внимание, что yarn.nodemanager.resource.memory-mb это общая память, которую один NodeManager может выделить во всех контейнерах на одном узле.

В вашем случае, так как yarn.nodemanager.resource.memory-mb = 12G Если вы сложите память, выделенную для всех контейнеров YARN на каком-либо отдельном узле, она не может превышать 12G.

Вы запросили 11G (-executor-memory 11G) для каждого контейнера Spark Executor. Хотя 11G меньше 12G, это все равно не сработает. Зачем?

  • Потому что вы должны учитывать spark.yarn.executor.memoryOverhead, который min(executorMemory * 0.10, 384) (по умолчанию, если вы не переопределите его).

Итак, следующая математика должна выполняться:

spark.executor.memory + spark.yarn.executor.memoryOverhead <= yarn.nodemanager.resource.memory-mb

См. https://spark.apache.org/docs/latest/running-on-yarn.html для получения последней документации по spark.yarn.executor.memoryOverhead

Более того, spark.executor.instances это просто запрос. Spark ApplicationMaster для вашего приложения сделает запрос в YARN ResourceManager о количестве контейнеров = spark.executor.instances, Запрос будет удовлетворен ResourceManager на узле NodeManager на основе:

  • Доступность ресурса на узле. Планирование YARN имеет свои нюансы - это хороший пример того, как работает YARN FairScheduler.
  • Будь то yarn.nodemanager.resource.memory-mb порог не был превышен на узле:
    • (количество искровых контейнеров, работающих на узле * (spark.executor.memory + spark.yarn.executor.memoryOverhead)) <= yarn.nodemanager.resource.memory-mb *

Если запрос не будет удовлетворен, запрос будет поставлен в очередь и будет удовлетворен при выполнении вышеуказанных условий.

Чтобы использовать искровой кластер на полную мощность, вам необходимо установить значения для --num-executors, --executor-cores и --executor-memory в соответствии с вашим кластером.

Флаг командной строки --num-executors или свойство конфигурации spark.executor.instances управляют количеством запрошенных исполнителей.

Флаг командной строки --executor-cores или свойство конфигурации spark.executor.cores управляет количеством одновременных задач, которые может выполнить исполнитель.

Флаг командной строки --executor-memory или свойство конфигурации spark.executor.memory управляют размером кучи.

У вас есть только 3 узла в кластере, и один будет использоваться в качестве драйвера, у вас осталось только 2 узла, как вы можете создать 6 исполнителей?

Я думаю ты запутался --num-executors с --executor-cores,

Чтобы увеличить параллелизм, вам нужно больше ядер, вы хотите использовать все процессоры в вашем кластере.

Другие вопросы по тегам