«1. Введение
Apache Spark — это среда кластерных вычислений с открытым исходным кодом. Он предоставляет элегантные API-интерфейсы разработки для Scala, Java, Python и R, которые позволяют разработчикам выполнять различные рабочие нагрузки с интенсивным использованием данных в различных источниках данных, включая HDFS, Cassandra, HBase, S3 и т. д.
Исторически MapReduce от Hadoop доказал свою эффективность. неэффективен для некоторых итерационных и интерактивных вычислительных задач, что в конечном итоге привело к разработке Spark. С помощью Spark мы можем выполнять логику на два порядка быстрее, чем с Hadoop, в памяти или на один порядок быстрее на диске.
2. Архитектура Spark
Приложения Spark работают как независимые наборы процессов в кластере, как показано на диаграмме ниже:
Эти наборы процессов координируются объектом SparkContext в вашей основной программе (называемым программа драйвера). SparkContext подключается к нескольким типам менеджеров кластеров (собственный автономный менеджер кластеров Spark, Mesos или YARN), которые распределяют ресурсы между приложениями.
После подключения Spark получает исполнителей на узлах в кластере, которые представляют собой процессы, выполняющие вычисления и сохраняющие данные для вашего приложения.
Затем он отправляет код вашего приложения (определенный файлами JAR или Python, переданными в SparkContext) исполнителям. Наконец, SparkContext отправляет задачи исполнителям для выполнения.
3. Основные компоненты
Следующая диаграмма дает четкое представление о различных компонентах Spark:
3.1. Spark Core
Компонент Spark Core отвечает за все основные функции ввода-вывода, планирование и мониторинг заданий на искровых кластерах, диспетчеризацию задач, сетевое взаимодействие с различными системами хранения, восстановление после сбоев и эффективное управление памятью.
В отличие от Hadoop, Spark избегает хранения общих данных в промежуточных хранилищах, таких как Amazon S3 или HDFS, используя специальную структуру данных, известную как RDD (Resilient Distributed Datasets).
Устойчивые распределенные наборы данных являются неизменяемыми, разделенными коллекциями записей, с которыми можно работать — параллельно и которые позволяют — отказоустойчивые вычисления «в памяти».
RDD поддерживают два типа операций:
Преобразование — преобразование Spark RDD — это функция, которая создает новые RDD из существующих RDD. Преобразователь принимает RDD на вход и выдает один или несколько RDD на выходе. Преобразования ленивы по своей природе, т. е. они выполняются, когда мы вызываем действие
Действие — преобразования создают RDD друг из друга, но когда мы хотим работать с фактическим набором данных, в этот момент выполняется действие. Таким образом, действия — это операции Spark RDD, которые дают значения, отличные от RDD. Значения действия сохраняются в драйверах или во внешней системе хранения
-
Действие — это один из способов отправки данных от Исполнителя к драйверу.
-
Исполнители — это агенты, отвечающие за выполнение задачи. В то время как драйвер — это процесс JVM, который координирует рабочие процессы и выполнение задачи. Некоторые из действий Spark — считать и собирать.
3.2. Spark SQL
Spark SQL — это модуль Spark для обработки структурированных данных. Он в основном используется для выполнения запросов SQL. DataFrame представляет собой основную абстракцию для Spark SQL. Распределенная коллекция данных, упорядоченных по именованным столбцам, называется DataFrame в Spark.
Spark SQL поддерживает получение данных из различных источников, таких как Hive, Avro, Parquet, ORC, JSON и JDBC. Он также масштабируется до тысяч узлов и многочасовых запросов с использованием механизма Spark, что обеспечивает полную отказоустойчивость в середине запроса.
3.3. Spark Streaming
Spark Streaming — это расширение основного API Spark, которое обеспечивает масштабируемую, высокопроизводительную и отказоустойчивую потоковую обработку потоков данных в реальном времени. Данные можно получать из ряда источников, таких как Kafka, Flume, Kinesis или TCP-сокеты.
Наконец, обработанные данные можно передавать в файловые системы, базы данных и интерактивные информационные панели.
3.4. Искра Млиб
«MLlib — это библиотека машинного обучения (ML) Spark. Его цель — сделать практическое машинное обучение масштабируемым и простым. На высоком уровне он предоставляет такие инструменты, как:
Алгоритмы машинного обучения — общие алгоритмы обучения, такие как классификация, регрессия, кластеризация и совместная фильтрация. Характеристика — извлечение признаков, преобразование, уменьшение размерности и отбор. « инструменты для построения, оценки и настройки ML Pipelines Persistence — сохранение и загрузка алгоритмов, моделей и утилит Pipelines — линейная алгебра, статистика, обработка данных и т. д.
3.5. Spark GraphX
-
GraphX — это компонент для графов и граф-параллельных вычислений. На высоком уровне GraphX расширяет RDD Spark, вводя новую абстракцию Graph: направленный мультиграф со свойствами, прикрепленными к каждой вершине и ребру.
Для поддержки вычислений графа GraphX предоставляет набор основных операторов (например, подграф, joinVertices и агрегатные сообщения).
Кроме того, GraphX включает в себя растущую коллекцию алгоритмов и построителей графов, упрощающих задачи анализа графов.
4. «Hello World» в Spark
Теперь, когда мы понимаем основные компоненты, мы можем перейти к простому проекту Spark на основе Maven — для подсчета количества слов.
Мы продемонстрируем Spark, работающий в локальном режиме, где все компоненты работают локально на той же машине, где это главный узел, узлы-исполнители или автономный менеджер кластера Spark.
4.1. Настройка Maven
Давайте настроим проект Java Maven с зависимостями, связанными со Spark, в файле pom.xml:
4.2. Подсчет слов — задание Spark
Давайте теперь напишем задание Spark для обработки файла, содержащего предложения, и вывода отдельных слов и их количества в файле:
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.10</artifactId>
<version>1.6.0</version>
</dependency>
</dependencies>
Обратите внимание, что мы передаем путь к локальному текстовому файлу как аргумент для задания Spark.
Объект SparkContext является основной точкой входа для Spark и представляет подключение к уже работающему кластеру Spark. Он использует объект SparkConf для описания конфигурации приложения. SparkContext используется для чтения текстового файла в памяти как объекта JavaRDD.
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();
}
Затем мы преобразуем строки объекта JavaRDD в слова объекта JavaRDD, используя метод плоской карты, чтобы сначала преобразовать каждую строку в слова, разделенные пробелами, а затем сгладить выходные данные обработки каждой строки.
Мы снова применяем операцию преобразования mapToPair, которая в основном сопоставляет каждое вхождение слова с кортежем слов и числом 1.
Затем мы применяем операцию reduceByKey для группировки нескольких вхождений любого слова с числом 1 в кортеж. слов и подвел итог.
Наконец, мы выполняем действие сбора RDD, чтобы получить окончательные результаты.
4.3. Выполнение — задание Spark
Теперь давайте создадим проект с помощью Maven для создания файла apache-spark-1.0-SNAPSHOT.jar в целевой папке.
Затем нам нужно отправить это задание WordCount в Spark:
Каталог установки Spark и каталог проекта WordCount Maven необходимо обновить перед выполнением вышеуказанной команды.
При отправке за кулисами происходит несколько шагов:
${spark-install-dir}/bin/spark-submit --class com.baeldung.WordCount
--master local ${WordCount-MavenProject}/target/apache-spark-1.0-SNAPSHOT.jar
${WordCount-MavenProject}/src/main/resources/spark_example.txt
Наконец, результат искрового задания возвращается драйверу, и мы видим количество слов в файле в качестве вывода:
5 Заключение
- From the driver code, SparkContext connects to cluster manager(in our case spark standalone cluster manager running locally)
- Cluster Manager allocates resources across the other applications
- Spark acquires executors on nodes in the cluster. Here, our word count application will get its own executor processes
- Application code (jar files) is sent to executors
- Tasks are sent by the SparkContext to the executors.
В этой статье мы обсудили архитектуру и различные компоненты Apache Spark. Мы также продемонстрировали рабочий пример задания Spark, подсчитывающего количество слов из файла.
Hello 1
from 2
Baledung 2
Keep 1
Learning 1
Spark 1
Bye 1
Как всегда, полный исходный код доступен на GitHub.
«
As always, the full source code is available over on GitHub.