Эта статья начнется с драйвера и исполнителя в spark, кратко опишем запущенный процесс, режим развертывания и внутренний механизм планирования задач spark, а также надеюсь проанализировать процесс выполнения задачи spark как можно лучше.
1. Два главных героя
В искре есть два важных главных героя, которых нельзя избежать, водитель и исполнитель. Их структура состоит из одного хозяина и нескольких рабов. Водитель - это единственная собака с сильным стремлением к контролю и огромной силой. Он один каждый день. Больше ничего. , я просто успел направить кучу исполнителей на работу везде. У них четкое разделение труда и простая организационная структура, которые в совокупности поддерживают мощный вычислительный движок Spark.
Driver
Узел драйвера Spark используется для выполнения основного метода в задаче Spark и отвечает за выполнение фактического кода. Водитель в основном несет ответственность за:
1. Преобразование логики кода в задачи;
2. Расписание задач между Исполнителями;
3.Отследить выполнение Исполнителя (задачи).
Executor
Узлы-исполнители Spark отвечают за выполнение определенных задач в заданиях Spark, и задачи не зависят друг от друга. При запуске приложения Spark одновременно запускается узел Executor, который всегда существует на протяжении всего жизненного цикла приложения Spark. Если узел Executor выходит из строя или дает сбой, приложение Spark может продолжать выполняться, а задачи на отказавшем узле будут отправлены на другие узлы Executor для продолжения выполнения. Executor имеет две основные функции:
1. Отвечает за выполнение задач, составляющих приложение Spark, и возврат результатов в процесс драйвера;
2. Предоставьте хранилище в памяти для RDD, которые требуют кэширования в пользовательских программах через собственный диспетчер блоков. RDD кэшируются непосредственно в процессе Executor, поэтому задачи могут в полной мере использовать кэшированные данные для ускорения операций во время выполнения.
Процесс запуска искры
Независимо от того, как развернут spark, после отправки задачи сначала запускается Драйвер, затем Драйвер регистрирует приложение в диспетчере кластера, а затем диспетчер кластера выделяет и запускает Исполнителя в соответствии с конфигурационным файлом задачи. , а затем Драйвер ждет, пока ресурсы будут удовлетворены.При выполнении основной функции Spark-запрос выполняется лениво.При выполнении оператора действия начинается реальное выполнение, и начинается обратный расчет.Этапы разбиты по к широким зависимостям. Тогда каждый этап соответствует набору задач, а в наборе задач несколько задач. задача, задача будет распределена указанному Исполнителю для выполнения. В процессе выполнения задачи Исполнитель также будет постоянно общаться с Драйвер для сообщения о текущем статусе задачи.
2. режим развертывания искры
2.1 искровой тип развертывания
Spark поддерживает в общей сложности 3 менеджера кластеров: Standalone, Mesos и Yarn.
- Автономный:
Автономный режим, простейший диспетчер кластеров, встроенный в Spark. Он может работать в различных операционных системах и поставляется с полным набором услуг, не полагаясь на какую-либо другую систему управления ресурсами.Использование автономного режима позволяет легко создать кластер.
-
Apache Mesos
Mesos также представляет собой мощный фреймворк для управления распределенными ресурсами, созданный по тем же принципам, что и ядро Linux, что позволяет развертывать на нем множество различных фреймворков.
-
Hadoop Yarn
Единый механизм управления ресурсами в экосистеме Hadoop может запускать несколько вычислительных сред, таких как mapreduce, spark и т. д. В зависимости от расположения драйвера в кластере режим развертывания можно разделить на yarn-client и yarn-cluster.
Режим работы Spark зависит от значения переменной окружения MASTER, переданной в SparkContext, и spark развертывается на пряже:
- yarn-client: Драйвер локальный, Executor находится в кластере Yarn, конфигурация:
--deploy-mode client
- пряжа-кластер: и драйвер, и исполнитель находятся в кластере пряжи, конфигурация:
--deploy-mode cluster
- yarn-client: Драйвер локальный, Executor находится в кластере Yarn, конфигурация:
2.2 Механизм работы в режиме пряжи
Текущий популярный режим работы — отправить искру в Yarn, поэтому здесь мы подробно рассмотрим искру в Yarn.
- режим клиента пряжи
В режиме YARNClient Драйвер запускается на локальном компьютере, на котором отправлена задача, Драйвер обращается к ResourceManager для запуска ApplicationMaster, а затем ResourceManager выделяет контейнер и запускает ApplicationMaster на соответствующем NodeManager. ApplicationMaster в настоящее время эквивалентен ExecutorLaucher, который отвечает только за память исполнителя запросов от ResourceManager. ResourceManager выделит контейнер после получения приложения ресурса от ApplicationMaster, а затем ApplicationMaster запускает процесс Executor на NodeManager, указанном в распределении ресурсов.После запуска процесса Executor он будет зарегистрирован в Driver в обратном порядке. Другая строка, когда собственные ресурсы Водителя удовлетворяются, Водитель начинает выполнять основную функцию, а затем при выполнении оператора Action запускается задание, и этапы делятся по широким зависимостям, каждый этап генерирует соответствующий TaskSet.После завершения регистрации Исполнителя, Драйвер распределяет задачи на выполнение каждому Исполнителю.
- yarn-cluster
В режиме кластера YARN после отправки задачи она свяжется с ResourceManager, чтобы запросить запуск ApplicationMaster, а затем ResourceManager выделит контейнер и запустит ApplicationMaster на соответствующем NodeManager. Водитель.
После запуска драйвера он применяется к ResourceManager для памяти Executor. ResourceManager выделит контейнер, а затем запустит процесс Executor на соответствующем NodeManager. После запуска процесса Executor он будет зарегистрирован в Driver в обратном порядке. Другая линия заключается в том, что когда собственные ресурсы Драйвера удовлетворяются, он начинает выполнять основную функцию, а затем при выполнении оператора Action запускается задание, и этапы делятся по широким зависимостям, каждый этап генерирует соответствующий taskSet. После того, как Исполнитель зарегистрирован, Драйвер Распределяет задачу каждому Исполнителю для выполнения.
3. Планирование задач Spark
Драйвер подготовит задачи в соответствии с пользовательской программой и распределит задачи Исполнителю.Сначала необходимо представить несколько концепций Spark:
-
Задание: используйте оператор Action в качестве границы и запускайте задание при обнаружении метода Action.
-
Этап: Подмножество задания, задание имеет по крайней мере один этап, ограниченный перетасовкой (т. е. широкими зависимостями RDD), и перетасовка делится на одну стадию.
-
Задача: подмножество Stage, измеряемое степенью параллелизма (количеством разделов), количеством разделов.
задача.
При планировании конкретных задач искра обычно делится на два способа: планирование на уровне этапа и планирование на уровне задачи. Spark RDD формирует граф родственных связей DAG с помощью оператора Transactions и, наконец, запускает задание и планирует выполнение с помощью оператора Action.
DAGScheduler отвечает за планирование на уровне этапа, в основном разделяя группу обеспечения доступности баз данных на несколько этапов и упаковывая каждый этап в набор задач и отправляя его в TaskScheduler для планирования.
TaskScheduler отвечает за планирование на уровне задач и распределяет TaskSet, предоставленный DAGScheduler, исполнителю для выполнения в соответствии с указанной политикой планирования.
3.1 Планирование стадии искры
Планирование задач Spark начинается с вырезания DAG, которое в основном выполняется DAGScheduler. При обнаружении операции Action будет инициирован расчет задания, который будет передан DAGScheduler для обработки.
DAGScheduler в основном выполняет две части:
- расщепленный этап
DAGScheduler разделит DAG, образованный кровным родством RDD, и разделит работу на несколько этапов.Конкретная стратегия разделения: от конца к началу, окончательный RDD будет постоянно оценивать, является ли родительская зависимость широкой зависимостью. через откат зависимостей.Чтобы перетасовать, разделите этап. Та, что без перетасовки, называется узкой зависимостью, а СДР между узкими зависимостями делятся на один и тот же этап. Разделенные этапы разделены на две категории: один называется ResultStage, который является самым нижестоящим этапом DAG, который определяется методом Action, а другой называется ShuffleMapStage, который подготавливает данные для нижестоящего этапа.
Планирование поэтапных задач само по себе представляет собой обратный алгоритм глубокого обхода.В качестве примера возьмем подсчет слов на следующем рисунке. Здесь только saveAsTextFile является оператором действия.Задание состоит из методов RDD-3 и saveAsTextFile.По возврату зависимостей мы знаем, что можем вернуться к RDD-0 без зависимостей. В процессе возврата происходит перетасовка reduceByKey в RDD-2 и RDD-3, которые будут разбиты на этапы.Поскольку RDD-3 находится на последнем этапе, то есть делится на ResultStage, RDD-2, RDD-1, RDD-0, среди этих зависимостей Оператор преобразования flatMap, map не имеет перетасовки, потому что это узкие зависимости, разделенные на ShuffleMapStage.
- Упаковать набор задач для отправки этапа
Если у этапа нет родительского этапа, то этап начинает отправляться, а дочерний этап может быть отправлен только после выполнения родительского этапа. При отправке этапа информация о задании (информация о разделе, методы и т. д.) будет сериализована и упакована в TaskSet для TaskScheduler. Один раздел соответствует задаче. С другой стороны, TaskScheduler будет отслеживать состояние выполнения Стадия.Только исполнитель теряется или задача завершается сбоем из-за выборки.Необходимо повторно отправить неудачную стадию, чтобы запланировать неудачную задачу, а другие типы сбоев задачи будут повторяться в процессе планирования TaskScheduler.
3.2 Планирование Spark на уровне задач
Планирование SparkTask завершается с помощью TaskScheduler, который инкапсулирует полученный набор задач как TaskSetManager и добавляет его в очередь планирования. Одновременно может быть несколько TaskSetManager, один TaskSetManager соответствует одному TaskSet, а один TaskSet содержит n нескольких сведений о задачах, все из которых находятся на одном этапе.
После того, как TaskScheduler будет инициализирован, он запустит SchedulerBackend, который отвечает за взаимодействие с внешним миром, получение регистрационной информации Executor и поддержание статуса Executor. спросите TaskScheduler, есть ли задачи для запуска, и TaskScheduler будет следовать расписанию из очереди планирования.Указанная стратегия планирования выбирает TaskSetManager для планирования операции.
TaskSetManager берет задачи одну за другой в соответствии с определенными правилами планирования в TaskScheduler, а TaskScheduler затем передает их SchedulerBackend для отправки Executor для выполнения.
После того, как Задача передана Исполнителю для начала выполнения, Исполнитель сообщит о статусе выполнения SchedulerBackend, а SchedulerBackend сообщит TaskScheduler, TaskScheduler найдет TaskSetManager, соответствующий Задаче, и уведомит TaskSetManager, так что TaskSetManager знает текущий статус задачи
3.3 Неудачная повторная попытка и белый список
Для задач, которые не удалось запустить, TaskSetManager будет записывать количество сбоев. количество попыток превышает максимально допустимое количество раз, все приложение завершается сбоем. В процессе записи количества сбоев Задачи TaskSetManager также запишет ExecutorId и Хост, на котором произошел сбой в последний раз, чтобы при следующем планировании этого Задания использовался механизм черного списка, чтобы предотвратить его запланированное выполнение. узел, который вышел из строя в последний раз, до определенной степени отказоустойчивости.