Apache Spark: различия между режимами развертывания клиента и кластера

TL; DR: в чем разница между режимами развертывания клиента и кластера в автономном кластере Spark? Как мне установить, в каком режиме будет работать мое приложение?


У нас есть автономный кластер Spark с тремя машинами, все с Spark 1.6.1:

  • Главный компьютер, на котором также запускается наше приложение с использованием spark-submit
  • 2 одинаковых рабочих машины

В документации Spark я прочитал:

(...) Для автономных кластеров Spark в настоящее время поддерживает два режима развертывания. В клиентском режиме драйвер запускается в том же процессе, что и клиент, отправляющий приложение. Однако в кластерном режиме драйвер запускается из одного из рабочих процессов внутри кластера, и клиентский процесс завершается, как только он выполняет свои обязанности по отправке приложения, не дожидаясь завершения работы приложения.

Однако я не совсем понимаю практические различия, читая это, и я не понимаю, каковы преимущества и недостатки различных режимов развертывания.

Кроме того, когда я запускаю свое приложение с помощью команды start-submit, даже если я установил для свойства spark.submit.deployMode значение «cluster», пользовательский интерфейс Spark для моего контекста показывает следующую запись:

Контекстный интерфейс

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

1) В чем практические различия между режимом развертывания client Standalone Spark и режимом развертывания кластера? Какие плюсы и минусы использования каждого из них?

2) Как выбрать, на каком из приложений будет работать, используя spark-submit?


person Daniel de Paula    schedule 04.05.2016    source источник


Ответы (3)


В чем практические различия между режимом развертывания отдельного клиента Spark и режимом развертывания кластера? Какие плюсы и минусы использования каждого из них?

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

Клиент:

  • Драйвер работает на выделенном сервере (главном узле) внутри выделенного процесса. Это означает, что в его распоряжении есть все доступные ресурсы для выполнения работы.
  • Драйвер открывает выделенный HTTP-сервер Netty и распространяет указанные файлы JAR на все рабочие узлы (большое преимущество).
  • Поскольку главный узел имеет собственные выделенные ресурсы, вам не нужно «тратить» рабочие ресурсы на программу Driver.
  • Если процесс драйвера умирает, вам понадобится внешняя система мониторинга, чтобы сбросить его выполнение.

Кластер:

  • Драйвер работает на одном из рабочих узлов кластера. Работника выбирает Мастер-лидер.
  • Драйвер работает как выделенный автономный процесс внутри Worker.
  • Программы драйвера занимают по крайней мере 1 ядро ​​и выделенный объем памяти у одного из рабочих процессов (это можно настроить).
  • Программа драйвера может контролироваться с главного узла с помощью флага --supervise и быть сброшена в случае его смерти.
  • При работе в кластерном режиме все JAR-файлы, связанные с выполнением вашего приложения, должны быть общедоступными для всех рабочих. Это означает, что вы можете вручную разместить их в общем месте или в папке для каждого из рабочих.

Какой из них лучше? Не уверен, это на самом деле вам поэкспериментировать и решить. Это не лучшее решение здесь, вы получаете преимущества от первого и второго, вам решать, какой из них лучше подходит для вашего варианта использования.

Как выбрать, на каком будет работать мое приложение, с помощью spark-submit

Способ выбора режима запуска - использование флага --deploy-mode. На странице Конфигурация Spark:

/bin/spark-submit \
  --class <main-class>
  --master <master-url> \
  --deploy-mode <deploy-mode> \
  --conf <key>=<value> \
  ... # other options
  <application-jar> \
  [application-arguments]
person Yuval Itzchakov    schedule 04.05.2016
comment
Я заметил, что драйверу также нужен доступ к данным, хотя он не будет с этим ничего делать. Итак, если вы используете файловую систему для хранения некоторых файлов, вам необходимо иметь одни и те же файлы как на узле драйвера, так и в кластере. - person Durga Swaroop; 19.04.2017
comment
@DurgaSwaroop Какой режим вы имеете в виду? - person Yuval Itzchakov; 19.04.2017
comment
В клиентском режиме. - person Durga Swaroop; 19.04.2017
comment
@DurgaSwaroop В клиентском режиме, если вы запускаете драйвер со своего главного узла, то, конечно, главный узел должен иметь все доступные файлы, поскольку он запускает ваш SparkContext. - person Yuval Itzchakov; 19.04.2017
comment
Не только с главного узла. Если я начинаю с узла, находящегося полностью вне кластера, он по-прежнему ожидает, что файлы будут доступны из драйвера. - person Durga Swaroop; 19.04.2017
comment
@DurgaSwaroop Вы правы, главный узел был только примером. - person Yuval Itzchakov; 19.04.2017
comment
Знаете ли вы, почему водитель ожидает, что данные будут присутствовать вместе с самим собой? Потому что я обнаружил, что в конце концов он ничего не делает с ним, но по-прежнему ожидает данных. - person Durga Swaroop; 19.04.2017
comment
@DurgaSwaroop Поскольку драйвер инициализирует SparkContext, в нем должен присутствовать сам код, иначе как бы он начал работу? - person Yuval Itzchakov; 19.04.2017
comment
Я говорю о данных. Драйвер ожидает код, и все в порядке. Но почему он ожидает, что данные также будут присутствовать в драйвере (в случае файла файловой системы)? - person Durga Swaroop; 19.04.2017
comment
@DurgaSwaroop Давайте продолжим обсуждение в чате. - person Yuval Itzchakov; 19.04.2017
comment
Что вы имеете в виду, говоря, что драйвер ожидает, что данные будут присутствовать внутри себя? Я использую настройку с одним узлом, поэтому это означает, что у меня должны быть данные в самой этой настройке, верно? он не должен находиться на каком-то внешнем месте. Я прав ?? @YuvalItzchakov - person RushHour; 31.01.2019
comment
@YuvalItzchakov Я думаю, что ваше описание режима кластера правильное, но в клиентском режиме кажется, что драйвер не запускается на главном узле. См. Документацию Spark spark.apache.org/docs/latest/spark-standalone. html. Я не понимаю, отражают ли автономный клиент и режим кластера режимы кластера и клиента YARN, но в клиенте YARN драйвер всегда находится за пределами кластера - person soundofsilence; 11.04.2020
comment
@soundofsilence В автономном режиме клиентский режим будет работать, откуда бы вы ни отправили задание. Что касается YARN, я не уверен, хотя следующее, кажется, указывает на нечто подобное: В клиентском режиме исполнители Spark будут использовать локальные каталоги, настроенные для YARN, в то время как драйвер Spark будет использовать те, которые определены в spark.local.dir. Это связано с тем, что драйвер Spark не запускается в кластере YARN в клиентском режиме, а работают только исполнители Spark. - person Yuval Itzchakov; 11.04.2020
comment
@YuvalItzchakov спасибо. Я предполагаю, вы имеете в виду, что драйвер будет работать, откуда бы вы ни отправили задание. - person soundofsilence; 12.04.2020

Допустим, вы собираетесь выполнить искровую отправку в EMR, выполнив SSH на главном узле. Если вы предоставляете параметр --deploy-mode cluster, произойдет следующее.

  1. Вы не сможете увидеть подробные логи в терминале.
  2. Поскольку драйвер не создается в самом Мастере, вы не сможете прервать задание с терминала.

Но в случае клиента --deploy-mode:

  1. Вы сможете увидеть подробные логи в терминале.
  2. Вы сможете завершить работу с самого терминала.

Это основные вещи, которые я заметил до сих пор.

person Suman Sushovan    schedule 09.07.2018

У меня тоже такой же сценарий, здесь главный узел использует автономный кластер ec2. В этой настройке подходит режим клиента. В этом драйвере запускается непосредственно в процессе spark-submit, который действует как клиент для кластера. Вход и выход приложения прикреплены к консоли. Таким образом, этот режим особенно подходит для приложений, использующих REPL.

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

person jeevan kishore    schedule 26.07.2017