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
,
Чтобы увеличить параллелизм, вам нужно больше ядер, вы хотите использовать все процессоры в вашем кластере.