Добро пожаловать в серию статей технической группы Meitu по работе с данными «Spark: от начального до мастерского». Эта серия статей расскажет о Spark от простого к сложному, от введения фреймворка до реализации базовой архитектуры. поверьте, всегда есть поза, которая вам подходит.Приветствую всех, следите за обновлениями :)
Что такое Искра?
Spark — это общая параллельная платформа, похожая на Hadoop MapReduce, с открытым исходным кодом лаборатории AMP Калифорнийского университета в Беркли.Это быстрый и универсальный механизм обработки больших данных и легкая унифицированная платформа обработки больших данных, предназначенная для крупномасштабной обработки данных.
Когда мы говорим о Spark, мы можем иметь в виду приложение Spark, программу пакетной обработки больших данных, которая работает на Yarn вместо MapReduce и хранится в HDFS; это также может относиться к использованию подпроектов, включая Spark sql, потоковую передачу Spark, и т. д.; даже единая платформа для обработки больших данных, такая как Tachyon и Mesos, или экосистема Spark.
Рисунок 1
Пока что Spark — это не просто замена MapReduce, он стал экосистемой Spark с множеством подпроектов. Как показано на рисунке 1, экосистему Spark можно разделить на четыре уровня:
Уровень хранения данных, некоторые распределенные системы хранения файлов или различные базы данных, представленные HDFS и Tachyon;
Уровень управления ресурсами, такой как Yarn, Mesos и другие менеджеры ресурсов;
механизм обработки данных;
Прикладной уровень, многие проекты на базе Spark;
Spark SQL предоставляет API для взаимодействия со Spark через HiveQL (язык запросов Hive, SQL-вариант Apache Hive). Каждая таблица базы данных обрабатывается как RDD, а SQL-запросы Spark преобразуются в операции Spark. Spark Streaming обрабатывает и контролирует потоки данных в реальном времени, что позволяет программам обрабатывать данные в реальном времени, как обычные RDD.
В следующей серии статей мы подробно познакомим вас с другими модулями и подпроектами в экосистеме Spark.Далее мы познакомим вас с характеристиками и принципами движка обработки данных Spark, сравнив его с MapReduce.
Особенности искры
Согласно результатам поиска Google и Baidu, поисковая тенденция Spark сравнялась с Hadoop или даже превзошла ее, что указывает на то, что Spark стал стандартом де-факто в вычислениях, а это означает, что технология больших данных не может обойти Spark.
При хранении, вычислениях и планировании ресурсов больших данных Spark в основном решает вычислительную проблему, то есть в основном заменяет функцию Mapreduce.Многие компании по-прежнему предпочитают использовать HDFS и Yarn для базового хранилища и планирования ресурсов. Почему многие предприятия выбирают Spark в качестве механизма обработки в экологической структуре Hadoop? Рассмотрим подробнее, какие у него есть особенности.
1. Быстро. Spark вычисляет на основе памяти (некоторые вычисления также основаны на диске);
2. Легко начать разработку. Вычислительную модель Spark, основанную на RDD, легче понять, чем вычислительную модель Hadoop, основанную на Map-Reduce, и ее проще разрабатывать и реализовывать различные сложные функции, такие как вторичная сортировка, topN и другие сложные операции. ;
3. Супер универсальность. Spark предоставляет технические компоненты, такие как Spark RDD, Spark SQL, Spark Streaming, Spark MLlib и Spark GraphX, которые могут выполнять автономную пакетную обработку, интерактивные запросы, потоковые вычисления, машинное обучение, графовые вычисления и т. д.;
4. Интегрируйте Hadoop. Spark прекрасно интегрируется с Hadoop. HDFS, Hive и HBase Hadoop отвечают за хранение, Yarn отвечает за планирование ресурсов, а Spark отвечает за вычисления больших данных, которые являются популярным решением для больших данных.
4. Чрезвычайно активный. Spark в настоящее время является проектом верхнего уровня Apache Foundation.В мире есть большое количество выдающихся инженеров, которые являются коммиттерами Spark, и многие из ведущих мировых ИТ-компаний используют Spark в больших масштабах.
Посмотрите на MapReduce, который также отвечает за проблему вычисления, как показано на рисунке 2, MapReduce вычисляет WordCount.
фигура 2
MapReduce решает множество сценариев обработки больших данных, но его ограничения также очевидны:
MapReduce предоставляет только две операции, Map и Reduce, которым не хватает выразительности и требуется большое количество заданий для выполнения сложных вычислений.
Промежуточные результаты также помещаются в файловую систему HDFS, что неэффективно для итерационных вычислений.
Для пакетной обработки данных поддержка обработки данных в реальном времени недостаточна для интерактивной обработки данных.
Нужно написать много низкоуровневого кода, трудно приступить к работе. Показанная выше программа WordCount требует по крайней мере трех классов Java: класс Map, класс Reduce, класс Job, которые здесь подробно не перечислены.
Многие проекты улучшили его ограничения (например, Tez и т. д.), а затем посмотрите на конкретный процесс работы Spark на рисунке 3:
изображение 3
Прежде всего, мы видим, что Spark предоставляет множество операторов (textFile, FlatMap, Map, ReduceByKey и т. д.), и нет операции для сохранения промежуточных результатов в HDFS. Затем для программы WordCount, показанной выше, Spark нужна только следующая строка кода:
sc.textFile(s"${path}").flatMap(_.split(" ")).map(word => (word, 1)).reduceByKey(_ + _).saveAsTextFile("hdfs://xxx")
На рис. 4 приведены некоторые сравнения Spark и MapReduce в качестве механизмов обработки данных. Стоит упомянуть о масштабах обработки данных.После рождения Spark в сообществе было много голосов, ставящих под сомнение масштабы обработки данных Spark.Потом чиновник поставил эксперимент по сортировке ПБ данных, и время обработки сломалось рекорд на тот момент. Но мы не можем игнорировать тот факт, что в реальном производственном процессе мы имеем дело не с программой или задачей.В одном кластере, если есть много плохо оптимизированных программ Spark, много памяти будет потрачено впустую, поэтому что некоторые программы должны ждать в очереди, и в этом случае размер данных, обрабатываемых Spark, может быть меньше, чем размер, обрабатываемый MapReduce. (В последующих статьях этой серии также будет представлен соответствующий контент о настройке памяти Spark.)
Рисунок 4
Что касается последнего пункта отказоустойчивости, то результаты каждой операции в MapReduce будут храниться на диске, и их можно будет восстановить с диска при возникновении ошибки в расчете; Spark необходимо пересчитать данные согласно информации в RDD, который будет стоить определенное количество времени Ресурсы. Spark предоставляет два метода восстановления после сбоя: повторно выполнить предыдущую обработку через кровную связь данных; Checkpoint сохраняет набор данных в постоянном хранилище. Теоретически, если вы решите добавить CheckPoint к каждому выполненному маленькому шагу, производительность отказоустойчивости Spark может быть такой же надежной, как MR. Конечно, мало кто так делает.
Мы сравниваем Spark с MapReduce. См. улучшение Spark в отношении ограничений MapReduce, а также его быстрых функций общего назначения. Далее мы объясним, почему он может достичь этих характеристик с помощью дизайнерских идей и процесса исполнения Spark.
Основы искры
Рисунок 5
Как показано на рисунке 5, SparkContext создается узлом в качестве драйвера в кластере Spark. Точка входа приложения Spark отвечает за планирование различных вычислительных ресурсов и координацию исполнителей на каждом рабочем узле. В соответствии с введенными пользователем параметрами будет сгенерировано несколько воркеров.Рабочие узлы будут запускать несколько экзекьюторов.Экзекьютор - это процесс, который запускает свои задачи.Каждая задача выполняет один и тот же сегмент кода для обработки разных данных.
Изображение 6
Конкретный процесс выполнения Spark показан на рисунке 6. Клиент отправляет задание, выполняет основную функцию пользовательского кода посредством вызова отражения, а затем запускает CoarseGrainedExecutorBackend и инициализирует SparkContext.
*Инициализация SparkContext включает инициализацию страницы мониторинга SparkUI, среды выполнения SparkEnv, диспетчера безопасности SecurityManager, разделения этапов и планировщика DAGScheduler, планировщика заданий TaskSchedulerImpl и компонента планирования CoarseGrainedSchedulerBackend, который взаимодействует с Executor.
После того, как планировщик DAG разделит задания, он по очереди отправляет набор задач, соответствующий стадии, в TaskSchedulerImpl.TaskSchedulerImpl отправит набор задач в бэкэнд CoarseGrainedSchedulerBackend на стороне драйвера, а затем CoarseGrainedSchedulerBackend запустит задачи одну за другой. После того, как удаленный CoarseGrainedExecutorBackend получит событие отправки задачи, он вызовет Executor для выполнения задачи, и последняя задача будет запущена в методе run TaskRunner.
Так как же DAG Scheduler распределяет задания в процессе 4? Что, если этапы, задачи и т. д. генерируются для выполнения Executor? Далее мы рассмотрим пример выполнения разделения работы.
Рисунок 7
На рис. 7 показана программа Spark, которая считывает данные из HDFS для создания RDD-A, затем плоское преобразование в RDD-B, чтение другой части данных в RDD-C, а затем преобразование в RDD-D, агрегирование RDD-D. -E, объединить RDD-B и RDD-E, чтобы получить RDD-F, а затем сохранить результат в HDFS.
Spark разделен на разные этапы (Stage) в соответствии с различными точечными зависимостями между RDD. На этом пути четыре этапа. Stage0 и Stage2 могут выполняться параллельно, поскольку у них нет зависимостей. Но Stage2 должен дождаться завершения выполнения Stage1. Операция агрегирования RDD-D в RDD-F и RDD-B и RDD-E, полученные этапами 0 и 2, объединяются в RDD-F, и этот процесс генерирует перетасовку. Этапы без зависимостей могут выполняться параллельно, но для заданий Spark выполняется последовательно.Если вы хотите выполнять задания параллельно, вы можете выполнить многопоточное программирование в программе Spark.
На этой диаграмме DAG Spark может полностью понять кровную связь между данными, чтобы после сбоя некоторых задач он мог повторно выполнить расчет для получения неудавшегося RDD в соответствии с кровной связью.
*Широкие и узкие зависимости
Узкая зависимость означает, что каждый раздел родительского RDD используется только одним разделом дочернего RDD, а дочерние разделы RDD обычно соответствуют постоянному количеству родительских разделов RDD;
Широкая зависимость означает, что каждый раздел родительского RDD может использоваться несколькими дочерними разделами RDD, а дочерние разделы RDD обычно соответствуют всем родительским разделам RDD. Эта концепция раскрывается в следующих примерах.
Spark предоставляет множество операторов, а операции носят более общий характер. Так как же эта схема разделения заданий и выполнения параллельных вычислений позволяет Spark получать быстрые результаты на основе вычислений в памяти? Говорят, что Spark хорош в итеративных вычислениях, поэтому давайте сравним его с MapReduce с помощью классической итерационной задачи — алгоритма PageRank.
Рисунок 8, через http://www.jos.org.cn/jos/ch/reader/create_pdf.aspx?file_no=5557&journal_id=jos
Рисунок 8 представляет собой итеративный процесс алгоритма рейтинга страниц, выполняемый MapReduce.Следует отметить, что серая часть — это данные, которые необходимо сохранить на диск.
Рисунок 9, через http://www.jos.org.cn/jos/ch/reader/create_pdf.aspx?file_no=5557&journal_id=jos
На рис. 9 показан итеративный процесс выполнения Spark алгоритма pageRank, в котором реализовано множество улучшений по сравнению с MapReduce. Во-первых, Spark позволяет пользователям кэшировать часто используемые данные в памяти при наличии достаточного количества памяти, что ускоряет скорость работы системы; во-вторых, Spark имеет четкое разделение зависимостей между данными и выполняет задачи в соответствии с широкими и узкими зависимостями. , Он может реализовать работу конвейера и повысить гибкость системы.
Рисунок 10. MapReduce выполняет вторую итерацию алгоритма PageRank через http://www.jos.org.cn/jos/ch/reader/create_pdf.aspx?file_no=5557&journal_id=jos.
Рисунок 11: Spark выполняет вторую итерацию алгоритма PageRank через http://www.jos.org.cn/jos/ch/reader/create_pdf.aspx?file_no=5557&journal_id=jos.
Как показано на рисунке, Spark может выделять под задачу разделы RDD с узкими зависимостями и выполнять конвейерные операции.Внутренние данные задачи не нужно передавать по сети и задачи не мешают друг другу.Поэтому Spark имеет только три перетасовки для двух итераций.
В процессе итераций MapReduce и Spark могут не иметь большой разницы в производительности, но по мере увеличения количества итераций разрыв между ними постепенно становится очевидным. Стратегия планирования задач, принятая Spark на основе зависимостей, значительно сокращает количество перетасовок по сравнению с MapReduce, поэтому дизайн Spark очень подходит для итерационных операций.
Оглядываясь назад на эту статью, мы представили Spark с точки зрения концепции, характеристик и принципа, в свою очередь, В следующей статье мы подробно расскажем о процессе работы и механизме Spark на Yarn, так что следите за обновлениями.
Приложение: Глоссарий по Spark