Как распределить больше исполнителей на одного работника в режиме автономного кластера?

Я использую Spark 1.3.0 в кластере из 5 рабочих узлов с 36 ядрами и 58 ГБ памяти каждый. Я хотел бы настроить кластер Spark Standalone со многими исполнителями на одного рабочего.

Я видел объединенный SPARK-1706, однако сразу не ясно, как на самом деле настроить несколько исполнителей.

Вот последняя конфигурация кластера:

spark.executor.cores = "15"
spark.executor.instances = "10"
spark.executor.memory = "10g"

Эти настройки устанавливаются на SparkContext, когда приложение Spark отправляется в кластер.

Ответ 1

Сначала вам нужно настроить свой искровой автономный кластер, а затем установить объем ресурсов, необходимых для каждого отдельного искрового приложения, которое вы хотите запустить.

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

  • В conf/spark-env.sh:

    • Установите SPARK_WORKER_INSTANCES = 10, который определяет количество экземпляров Worker (#Executors) на node (его значение по умолчанию равно 1)
    • Задайте SPARK_WORKER_CORES = 15 # число ядер, которые может использовать один Рабочий (по умолчанию: все ядра, ваш случай равен 36).
    • Установите SPARK_WORKER_MEMORY = 55g # общий объем памяти, который можно использовать на одном компьютере (рабочий Node) для запуска программ Spark.
  • Скопируйте этот файл конфигурации во все узлы работника в той же папке

  • Запустите кластер, запустив скрипты в sbin (sbin/start-all.sh,...)

Поскольку у вас есть 5 рабочих, с указанной конфигурацией вы должны увидеть 5 (рабочих) * 10 (исполнителей на одного работника) = 50 живых исполнителей на главном веб-интерфейсе (http://localhost:8080 по умолчанию)

При запуске приложения в автономном режиме по умолчанию он будет приобретать все доступные исполнители в кластере. Вам нужно явно указать количество ресурсов для запуска этого приложения: Например:

val conf = new SparkConf()
             .setMaster(...)
             .setAppName(...)
             .set("spark.executor.memory", "2g")
             .set("spark.cores.max", "10")

Ответ 2

Начиная с Spark 1.4, это можно настроить следующим образом:

Настройка: spark.executor.cores

По умолчанию: 1 в режиме YARN, все доступные ядра для рабочего в автономном режиме.

Описание: количество ядер, используемых для каждого исполнителя. Только для YARN и автономного режима. В автономном режиме установка этого параметра позволяет приложению запускать несколько исполнителей на одного и того же работника при условии, что для этого рабочего достаточно ядер. В противном случае на каждого работника будет выполняться только один исполнитель для каждого приложения.

http://spark.apache.org/docs/1.4.0/configuration.html#execution-behavior

Ответ 3

До сих пор Развертывание автономного кластера Apache Spark 2.2 не разрешает проблему количества ИСПОЛНИТЕЛЕЙ на WORKER, но есть альтернатива для этого: запуск Искры-исполнители вручную:

[[email protected] ~spark/bin]# ./spark-class org.apache.spark.executor.CoarseGrainedExecutorBackend --driver-url spark://[email protected]:PORT --executor-id val --hostname localhost-val --cores 41 --app-id app-20170914105902-0000-just-exemple --worker-url spark://[email protected]:34117

Я надеюсь, что вам помогут!

Ответ 4

В автономном режиме по умолчанию все ресурсы кластера приобретаются при запуске приложения. Вам нужно указать количество исполнителей, которые вам нужны, с помощью конфигураций --executor-cores и --total-executor-cores.

Например, если в вашем кластере есть 1 рабочий (1 рабочий == 1 компьютер, в вашей кластере - хорошая работа, у вас есть только 1 сотрудник на машину), у которого в пуле есть 3 ядра и 3G (это указанный в spark-env.sh), когда вы отправляете приложение с --executor-cores 1 --total-executor-cores 2 --executor-memory 1g, два запуска запускаются для приложения с 1 ядром и 1g каждый. Надеюсь, это поможет!