«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 Заключение

  1. From the driver code, SparkContext connects to cluster manager(in our case spark standalone cluster manager running locally)
  2. Cluster Manager allocates resources across the other applications
  3. Spark acquires executors on nodes in the cluster. Here, our word count application will get its own executor processes
  4. Application code (jar files) is sent to executors
  5. 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.