Как управлять несколькими исполнителями на рабочих узлах с помощью автономного кластера Spark?
До сих пор я использовал Spark только в кластере Hadoop с YARN в качестве менеджера ресурсов. В этом типе кластера я точно знаю, сколько исполнителей нужно запустить и как работает управление ресурсами. Однако, знайте, что я пытаюсь использовать Автономный кластер искр, я немного запутался. Поправь меня, где я не прав.
Из этой статьи по умолчанию рабочий узел использует всю память узла минус 1 ГБ. Но я понимаю, что с помощью SPARK_WORKER_MEMORY
мы можем использовать меньше памяти. Например, если общий объем памяти узла составляет 32 ГБ, но я указываю 16 ГБ, Spark worker не будет использовать больше 16 ГБ на этом узле?
Но как насчет исполнителей? Скажем, если я хочу запустить 2 исполнителя на узел, могу ли я сделать это, указав память исполнителя во время spark-submit
быть половиной SPARK_WORKER_MEMORY
и, если я хочу запустить 4 исполнителя на узел, указав память исполнителя на четверть SPARK_WORKER_MEMORY
?
Если так, то кроме памяти исполнителя, я думаю, мне бы также пришлось правильно указывать ядра исполнителя. Например, если я хочу запустить 4 исполнителя на одном работнике, мне нужно будет указать ядра исполнителей на четверть SPARK_WORKER_CORES
? Что произойдет, если я укажу большее число, чем это? Я имею в виду, если я укажу память исполнителя на четверть SPARK_WORKER_MEMORY
, но исполнителю ядра будет только половина SPARK_WORKER_CORES
? Получу ли я в этом случае 2 или 4 исполнителя на этом узле?
2 ответа
Итак, я немного экспериментировал с кластером Spark Standalone, и это то, что я заметил.
Моя интуиция о том, что несколько исполнителей могут быть запущены внутри рабочего, настраивая ядра исполнителей, была действительно правильной. Допустим, у вашего работника 16 ядер. Теперь, если вы укажете 8 ядер для исполнителей, Spark будет запускать 2 исполнителя на одного работника.
Сколько исполнителей выполняется внутри рабочего, также зависит от памяти исполнителя, которую вы укажете. Например, если рабочая память составляет 24 ГБ, и вы хотите запустить 2 исполнителя на одного рабочего, вы не можете указать память исполнителя более 12 ГБ.
Память рабочего может быть ограничена при запуске ведомого устройства путем указания значения для необязательного параметра
--memory
или путем изменения значенияSPARK_WORKER_MEMORY
, То же с количеством ядер (--cores
/SPARK_WORKER_CORES
).
Если вы хотите иметь возможность запускать несколько заданий в автономном кластере Spark, вы можете использовать spark.cores.max
свойство конфигурации при выполнении spark-submit
, Например, вот так.
spark-submit <other parameters> --conf="spark.cores.max=16" <other parameters>
Таким образом, если ваш автономный кластер Spark допускает в общей сложности 64 ядра, а вы предоставляете только 16 ядер для своей программы, другие задания Spark могут использовать оставшиеся 48 ядер.
Это лучший способ контролировать количество исполнителей, ядер и памяти в моем опыте.
Вы можете установить общее количество ядер для всех исполнителей и количество ядер для каждого исполнителя, вы можете установить память исполнителя
--total-executor-cores 12 --executor-cores 2 --executor-memory 6G
Это даст вам 6 исполнителей и 2 ядра /6G на каждого исполнителя, так что в целом вы смотрите на 12 ядер и 36G
Вы можете установить память драйвера, используя
- драйвер памяти 2G