Ответ 1
Spark использует архитектуру master/slave. Как вы можете видеть на рисунке, у него есть один центральный координатор (Драйвер), который общается со многими распределенными рабочими (исполнителями). Драйвер и каждый из исполнителей работают в своих собственных процессах Java.
DRIVER
Драйвер - это процесс, в котором выполняется основной метод. Сначала он преобразует пользовательскую программу в задачи и после этого планирует выполнение задач у исполнителей.
ИСПОЛНИТЕЛИ
Исполнители - это процессы рабочих узлов, отвечающие за выполнение отдельных задач в задании Spark. Они запускаются в начале приложения Spark и обычно запускаются на протяжении всего срока службы приложения. Как только они запускают задачу, они отправляют результаты драйверу. Они также обеспечивают хранение в памяти для RDD, которые кэшируются пользовательскими программами через Block Manager.
ИСПОЛНИТЕЛЬНЫЙ ПОТОК ПРИМЕНЕНИЯ
С учетом этого, когда вы отправляете приложение в кластер с помощью spark-submit, это происходит внутри:
- Запускается автономное приложение и создает экземпляр
SparkContext
(и только тогда, когда вы можете вызвать приложение драйвером). - Программа драйвера просит ресурсы для менеджера кластера запускать исполнителей.
- Диспетчер кластеров запускает исполнителей.
- Процесс драйвера выполняется через пользовательское приложение. В зависимости от действий и преобразований над задачами RDD отправляются исполнителям.
- Исполнители запускают задачи и сохраняют результаты.
- Если какой-либо рабочий сработает, его задачи будут отправлены другим исполнителям для последующей обработки. В книге "Learning Spark: Lightning-Fast Big Data Analysis" они рассказывают об искровом и отказоустойчивости:
Spark автоматически обрабатывает неудавшиеся или медленные машины, повторно выполняя неудачные или медленные задачи. Например, если сбой в работе node, выполняющий раздел операции map(), Spark перезапустит его еще на node; и даже если node не сбой, а просто намного медленнее, чем другие узлы, Spark может предустановочно запускать "спекулятивную" копию задачи на другой node и принимать ее результат, если это завершается.
- С помощью SparkContext.stop() из драйвера или если главный метод выходит из строя, все исполнители будут прекращены, а ресурсы кластера будут освобождены диспетчером кластера.
ВАШИ ВОПРОСЫ
-
Когда исполнители запускаются, они регистрируются в драйвере и с этого момента напрямую общаются. Работники отвечают за передачу диспетчерам кластера доступности своих ресурсов.
-
В кластере YARN вы можете сделать это с помощью -num-executors. В автономном кластере вы получите одного исполнителя на одного работника, если вы не играете с spark.executor.cores, а у работника достаточно ядер, чтобы содержать более одного исполнителя. (Как заметил @JacekLaskowski, -num-executors больше не используется в YARN https://github.com/apache/spark/commit/16b6d18613e150c7038c613992d80a7828413e66)
-
Вы можете назначить количество ядер на каждого исполнителя с помощью -executor-core
-
- total-executor-core - максимальное количество ядер-исполнителей для каждого приложения
-
Как сказал Шон Оуэн в этой теме : "нет веских оснований для запуска более одного рабочего на машину". Например, у вас будет много JVM, сидящих на одной машине.
UPDATE
Я не смог проверить эти сценарии, но в соответствии с документацией:
ПРИМЕР 1: Spark будет жадно приобретать столько ядер и исполнителей, сколько предлагает планировщик. Таким образом, в итоге вы получите 5 исполнителей с 8 ядрами каждый.
ПРИМЕР 2 - 5: Spark не сможет выделить столько ядер, сколько запрошено у одного работника, поэтому никакие исполнители не будут запущены.