1. Введение
Apache Spark — это среда кластерных вычислений с открытым исходным кодом . Он предоставляет элегантные API-интерфейсы разработки для Scala, Java, Python и R, которые позволяют разработчикам выполнять различные рабочие нагрузки с интенсивным использованием данных из различных источников данных, включая HDFS, Cassandra, HBase, S3 и т. д.
Исторически сложилось так, что MapReduce в Hadoop оказался неэффективным для некоторых итерационных и интерактивных вычислительных задач, что в конечном итоге привело к разработке Spark. Со Spark мы можем выполнять логику на два порядка быстрее, чем с Hadoop, в памяти или на порядок быстрее на диске .
2. Искровая архитектура
Приложения Spark запускаются как независимые наборы процессов в кластере, как показано на схеме ниже :
Этот набор процессов координируется объектом SparkContext
в вашей основной программе (называемой программой-драйвером). SparkContext
подключается к нескольким типам менеджеров кластеров (собственный автономный менеджер кластеров Spark, Mesos или YARN), которые распределяют ресурсы между приложениями.
После подключения Spark получает исполнителей на узлах в кластере, которые представляют собой процессы, выполняющие вычисления и сохраняющие данные для вашего приложения.
Затем он отправляет код вашего приложения (определенный файлами JAR или Python, переданными в SparkContext
) исполнителям. Наконец, SparkContext
отправляет задачи исполнителям для выполнения .
3. Основные компоненты
Следующая диаграмма дает четкое представление о различных компонентах Spark:
3.1. Искровое ядро
Компонент Spark Core отвечает за все основные функции ввода-вывода, планирование и мониторинг заданий на искровых кластерах, диспетчеризацию задач, сетевое взаимодействие с различными системами хранения, устранение сбоев и эффективное управление памятью.
В отличие от Hadoop, Spark избегает хранения общих данных в промежуточных хранилищах, таких как Amazon S3 или HDFS, используя специальную структуру данных, известную как RDD (устойчивые распределенные наборы данных).
Устойчивые распределенные наборы данных — это неизменяемые, секционированные наборы записей, с которыми можно работать параллельно и которые позволяют выполнять отказоустойчивые вычисления «в памяти» .
RDD поддерживают два типа операций:
- Преобразование — преобразование Spark RDD — это функция, которая создает новые RDD из существующих RDD. Преобразователь принимает RDD на вход и выдает один или несколько RDD на выходе . Преобразования ленивы по своей природе, т. е. они выполняются, когда мы вызываем действие.
- Действие — преобразования создают RDD друг из друга, но когда мы хотим работать с фактическим набором данных, в этот момент выполняется действие. Таким образом,
действия
— это операции Spark RDD, которые дают значения, отличные от RDD. Значения действия сохраняются в драйверах или во внешней системе хранения
Действие — это один из способов отправки данных от Исполнителя к драйверу.
Исполнители — это агенты, отвечающие за выполнение задачи. В то время как драйвер — это процесс JVM, который координирует рабочие процессы и выполнение задачи. Некоторые из действий Spark — считать и собирать.
3.2. Искра SQL
Spark SQL — это модуль Spark для обработки структурированных данных. Он в основном используется для выполнения запросов SQL. DataFrame
представляет собой основную абстракцию для Spark SQL. Распределенная коллекция данных, упорядоченных по именованным столбцам, называется DataFrame
в Spark.
Spark SQL поддерживает получение данных из разных источников, таких как Hive, Avro, Parquet, ORC, JSON и JDBC. Он также масштабируется до тысяч узлов и многочасовых запросов с использованием механизма Spark, что обеспечивает полную отказоустойчивость в середине запроса.
3.3. Искра потокового
Spark Streaming — это расширение основного API Spark, которое обеспечивает масштабируемую, высокопроизводительную и отказоустойчивую потоковую обработку потоков данных в реальном времени. Данные можно получать из ряда источников, таких как Kafka, Flume, Kinesis или TCP-сокеты.
Наконец, обработанные данные можно передавать в файловые системы, базы данных и интерактивные информационные панели.
3.4. Искра Млиб
MLlib — это библиотека машинного обучения (ML) Spark. Его цель — сделать практическое машинное обучение масштабируемым и простым. На высоком уровне он предоставляет такие инструменты, как:
- Алгоритмы машинного обучения — общие алгоритмы обучения, такие как классификация, регрессия, кластеризация и совместная фильтрация.
- Характеризация - извлечение признаков, преобразование, уменьшение размерности и выбор
- Конвейеры — инструменты для построения, оценки и настройки конвейеров машинного обучения.
- Постоянство — сохранение и загрузка алгоритмов, моделей и конвейеров
- Утилиты — линейная алгебра, статистика, обработка данных и т. д.
3.5. График искрыX
GraphX — это компонент для графов и граф-параллельных вычислений. На высоком уровне GraphX расширяет RDD Spark, вводя новую абстракцию Graph: ориентированный мультиграф со свойствами, прикрепленными к каждой вершине и ребру.
Для поддержки вычисления графа GraphX предоставляет набор основных операторов (например, subgraph
, joinVertices
и агрегатные
сообщения ).
Кроме того, GraphX включает в себя растущую коллекцию алгоритмов и построителей графов, упрощающих задачи анализа графов.
4. «Привет, мир» в Spark
Теперь, когда мы понимаем основные компоненты, мы можем перейти к простому проекту Spark на основе Maven — для подсчета количества слов .
Мы продемонстрируем Spark, работающий в локальном режиме, где все компоненты работают локально на той же машине, где это главный узел, узлы-исполнители или автономный менеджер кластера Spark.
4.1. Настройка Maven
Давайте настроим проект Java Maven с зависимостями, связанными со Spark, в файле pom.xml
:
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.10</artifactId>
<version>1.6.0</version>
</dependency>
</dependencies>
4.2. Количество слов — Spark Job
Давайте теперь напишем задание Spark для обработки файла, содержащего предложения, и вывода отдельных слов и их количества в файле:
public static void main(String[] args) throws Exception {
if (args.length < 1) {
System.err.println("Usage: JavaWordCount <file>");
System.exit(1);
}
SparkConf sparkConf = new SparkConf().setAppName("JavaWordCount");
JavaSparkContext ctx = new JavaSparkContext(sparkConf);
JavaRDD<String> lines = ctx.textFile(args[0], 1);
JavaRDD<String> words
= lines.flatMap(s -> Arrays.asList(SPACE.split(s)).iterator());
JavaPairRDD<String, Integer> ones
= words.mapToPair(word -> new Tuple2<>(word, 1));
JavaPairRDD<String, Integer> counts
= ones.reduceByKey((Integer i1, Integer i2) -> i1 + i2);
List<Tuple2<String, Integer>> output = counts.collect();
for (Tuple2<?, ?> tuple : output) {
System.out.println(tuple._1() + ": " + tuple._2());
}
ctx.stop();
}
Обратите внимание, что мы передаем путь к локальному текстовому файлу в качестве аргумента для задания Spark.
Объект SparkContext
является основной точкой входа для Spark и представляет собой подключение к уже запущенному кластеру Spark. Он использует объект SparkConf
для описания конфигурации приложения. SparkContext
используется для чтения текстового файла в памяти как объекта JavaRDD
.
Затем мы преобразуем строки объекта JavaRDD
в слова объекта JavaRDD , используя метод
плоской карты
, чтобы сначала преобразовать каждую строку в слова, разделенные пробелами, а затем сгладить выходные данные обработки каждой строки.
Мы снова применяем операцию преобразования mapToPair
, которая в основном сопоставляет каждое вхождение слова с кортежем слов и числом 1.
Затем мы применяем операцию reduceByKey
, чтобы сгруппировать несколько вхождений любого слова с числом 1 в кортеж слов и суммировать количество.
Наконец, мы выполняем действие сбора
RDD, чтобы получить окончательные результаты.
4.3. Выполнение — искровое задание
Давайте теперь создадим проект с помощью Maven, чтобы сгенерировать apache-spark-1.0-SNAPSHOT.jar
в целевой папке.
Затем нам нужно отправить это задание WordCount в Spark:
${spark-install-dir}/bin/spark-submit --class com.foreach.WordCount
--master local ${WordCount-MavenProject}/target/apache-spark-1.0-SNAPSHOT.jar
${WordCount-MavenProject}/src/main/resources/spark_example.txt
Каталог установки Spark и каталог проекта WordCount Maven необходимо обновить перед выполнением вышеуказанной команды.
При подаче несколько шагов происходит за кулисами:
- Из кода драйвера
SparkContext
подключается к диспетчеру кластера (в нашем случае это автономный диспетчер кластера искры, работающий локально) . - Cluster Manager распределяет ресурсы между другими приложениями.
- Spark получает исполнителей на узлах в кластере. Здесь наше приложение для подсчета слов получит собственные процессы-исполнители.
- Код приложения (jar файлы) отправляется исполнителям
- Задачи отправляются
SparkContext
исполнителям.
Наконец, результат искрового задания возвращается драйверу, и в качестве вывода мы увидим количество слов в файле:
Hello 1
from 2
Baledung 2
Keep 1
Learning 1
Spark 1
Bye 1
5. Вывод
В этой статье мы обсудили архитектуру и различные компоненты Apache Spark. Мы также продемонстрировали рабочий пример задания Spark, подсчитывающего количество слов из файла.
Как всегда, полный исходный код доступен на GitHub .