Подтвердить что ты не робот

Внутренняя работа искры

В настоящее время продолжается искра. Spark использовал scala язык для загрузки и выполнения программы, а также python и java. RDD используется для хранения данных. Но я не могу понять архитектуру Spark, как она работает внутри.

Скажите, пожалуйста, Spark Architecture, а также как это работает внутри?

4b9b3361

Ответ 1

Даже я искал в Интернете, чтобы узнать о внутренних компонентах Spark, ниже я узнал и подумал об обмене здесь,

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

Spark преобразует преобразования RDD во что-то, называемое DAG (Directed Acyclic Graph), и запускает выполнение,

На высоком уровне, когда любое действие вызывается в RDD, Spark создает DAG и отправляется в планировщик DAG.

  • Планировщик DAG делит операторы на этапы задач. Этап состоит из задач, основанных на разделах входных данных. Операторы планировщика DAG вместе работают вместе. Напр. Многие операторы карты могут быть запланированы в один этап. Конечным результатом планировщика DAG является набор этапов.

  • Этапы передаются планировщику заданий. Планировщик задач запускает задачи через диспетчер кластеров (Spark Standalone/Yarn/Mesos). Планировщик задач не знает о зависимостях этапов.

  • Рабочий выполняет задачи на ведомом.

Давайте рассмотрим, как Spark создает DAG.

На высоком уровне существуют два преобразования, которые могут быть применены к RDD, а именно узкое преобразование и широкое преобразование. Широкие преобразования в основном приводят к границам сцены.

Узкое преобразование - не требует перетасовки данных по разделам. например, "Карта", "Фильтр" и т.д.

широкое преобразование - требует, чтобы данные были перетасованы, например, reduceByKey и т.д.

Давайте рассмотрим пример подсчета количества сообщений журнала на каждом уровне серьезности,

Ниже приведен файл журнала, начинающийся с уровня серьезности,

INFO I'm Info message
WARN I'm a Warn message
INFO I'm another Info message

и создайте следующий scala код, чтобы извлечь то же самое,

val input = sc.textFile("log.txt")
val splitedLines = input.map(line => line.split(" "))
                        .map(words => (words(0), 1))
                        .reduceByKey{(a,b) => a + b}

Эта последовательность команд неявно определяет DAG объектов RDD (RDD lineage), которые будут использоваться позже, когда вызывается действие. Каждый RDD поддерживает указатель на один или несколько родительских элементов вместе с метаданными о том, какой тип отношения он имеет с родителем. Например, когда мы называем val b = a.map() на RDD, RDD b сохраняет ссылку на своего родителя a, что линия.

Чтобы отобразить линейку RDD, Spark предлагает метод отладки toDebugString(). Например, выполняя команду toDebugString() в splitedLines RDD, выведет следующее,

(2) ShuffledRDD[6] at reduceByKey at <console>:25 []
    +-(2) MapPartitionsRDD[5] at map at <console>:24 []
    |  MapPartitionsRDD[4] at map at <console>:23 []
    |  log.txt MapPartitionsRDD[1] at textFile at <console>:21 []
    |  log.txt HadoopRDD[0] at textFile at <console>:21 []

Первая строка (внизу) показывает входной RDD. Мы создали этот RDD, вызвав sc.textFile(). См. Ниже более схематический вид графика DAG, созданного с данного RDD.

RDD DAG graph

После создания DAG, планировщик Spark создает физический план выполнения. Как упоминалось выше, планировщик DAG разбивает график на несколько этапов, этапы создаются на основе преобразований. Узкие трансформации будут сгруппированы (с трубкой) вместе в один этап. Итак, для нашего примера, Spark создаст двухэтапное выполнение следующим образом:

Stages

Затем планировщик DAG отправляет этапы в планировщик задач. Количество поставленных задач зависит от количества разделов, присутствующих в текстовом поле. Пример Fox рассмотрим, что в этом примере у нас есть 4 раздела, тогда будет создано 4 набора заданий, которые будут представлены параллельно, если будет достаточно ведомых/ядер. Ниже диаграмма иллюстрирует это более подробно,

Task execustion

Для получения более подробной информации я предлагаю вам просмотреть следующие видеоролики YouTube, где создатели Spark подробно расскажут о DAG и плане выполнения и времени жизни.