Что такое рабочие, исполнители, ядра в Spark Standalone cluster?

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

Является ли рабочий процессом JVM или нет? Я запустил bin\start-slave.sh и обнаружил, что он породил рабочего, который на самом деле является JVM.

Согласно приведенной выше ссылке, исполнитель - это процесс, запускаемый для приложения на рабочем узле, на котором выполняются задачи. Исполнитель также является JVM.

Вот мои вопросы:

  1. Исполнители по заявке. Тогда какова роль работника? Координирует ли это с исполнителем и передает результат обратно водителю? Или водитель напрямую общается с исполнителем? Если да, то какова цель работника тогда?

  2. Как контролировать количество исполнителей для заявки?

  3. Могут ли задачи выполняться параллельно исполнителю? Если да, как настроить количество потоков для исполнителя?

  4. Какова связь между работником, исполнителями и ядрами исполнителя (--total-executor-core)?

  5. Что значит иметь больше работников на узел?

Обновлено

Давайте возьмем примеры, чтобы лучше понять.

Пример 1: Автономный кластер с 5 рабочими узлами (каждый узел имеет 8 ядер) Когда я запускаю приложение с настройками по умолчанию.

Пример 2 Та же конфигурация кластера, что и в примере 1, но я запускаю приложение со следующими настройками --executor-cores 10 --total-executor-cores 10.

Пример 3 Та же конфигурация кластера, что и в примере 1, но я запускаю приложение со следующими настройками --executor-cores 10 --total-executor-cores 50.

Пример 4 Та же конфигурация кластера, что и в примере 1, но я запускаю приложение со следующими настройками --executor-cores 50 --total-executor-cores 50.

Пример 5 Та же конфигурация кластера, что и в примере 1, но я запускаю приложение со следующими настройками --executor-cores 50 --total-executor-cores 10.

В каждом из этих примеров Сколько исполнителей? Сколько потоков на одного исполнителя? Сколько ядер? Как определяется количество исполнителей для каждой заявки? Всегда ли это число рабочих?

Ответ 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 и принимать ее результат, если это завершается.

  1. С помощью 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 не сможет выделить столько ядер, сколько запрошено у одного работника, поэтому никакие исполнители не будут запущены.