Перейти к основному содержимому

Введение в Apache Spark

· 7 мин. чтения

1. Введение

Apache Spark — это среда кластерных вычислений с открытым исходным кодом . Он предоставляет элегантные API-интерфейсы разработки для Scala, Java, Python и R, которые позволяют разработчикам выполнять различные рабочие нагрузки с интенсивным использованием данных из различных источников данных, включая HDFS, Cassandra, HBase, S3 и т. д.

Исторически сложилось так, что MapReduce в Hadoop оказался неэффективным для некоторых итерационных и интерактивных вычислительных задач, что в конечном итоге привело к разработке Spark. Со Spark мы можем выполнять логику на два порядка быстрее, чем с Hadoop, в памяти или на порядок быстрее на диске .

2. Искровая архитектура

Приложения Spark запускаются как независимые наборы процессов в кластере, как показано на схеме ниже :

./4d32bad19a3f2c00a6a0f93708973e48.png

Этот набор процессов координируется объектом SparkContext в вашей основной программе (называемой программой-драйвером). SparkContext подключается к нескольким типам менеджеров кластеров (собственный автономный менеджер кластеров Spark, Mesos или YARN), которые распределяют ресурсы между приложениями.

После подключения Spark получает исполнителей на узлах в кластере, которые представляют собой процессы, выполняющие вычисления и сохраняющие данные для вашего приложения.

Затем он отправляет код вашего приложения (определенный файлами JAR или Python, переданными в SparkContext ) исполнителям. Наконец, SparkContext отправляет задачи исполнителям для выполнения .

3. Основные компоненты

Следующая диаграмма дает четкое представление о различных компонентах Spark:

./d2300f0b3dc1fdd7581956e579e435ed.jpg

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 необходимо обновить перед выполнением вышеуказанной команды.

При подаче несколько шагов происходит за кулисами:

  1. Из кода драйвера SparkContext подключается к диспетчеру кластера (в нашем случае это автономный диспетчер кластера искры, работающий локально) .
  2. Cluster Manager распределяет ресурсы между другими приложениями.
  3. Spark получает исполнителей на узлах в кластере. Здесь наше приложение для подсчета слов получит собственные процессы-исполнители.
  4. Код приложения (jar файлы) отправляется исполнителям
  5. Задачи отправляются SparkContext исполнителям.

Наконец, результат искрового задания возвращается драйверу, и в качестве вывода мы увидим количество слов в файле:

Hello 1
from 2
Baledung 2
Keep 1
Learning 1
Spark 1
Bye 1

5. Вывод

В этой статье мы обсудили архитектуру и различные компоненты Apache Spark. Мы также продемонстрировали рабочий пример задания Spark, подсчитывающего количество слов из файла.

Как всегда, полный исходный код доступен на GitHub .