Введение в Apache Spark

Введение в Apache Spark

1. Вступление

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

Исторически MapReduce Hadoop оказался неэффективным для некоторых итеративных и интерактивных вычислительных задач, что в конечном итоге привело к разработке Spark. With Spark, we can run logic up to two orders of magnitude faster than with Hadoop in memory, or one order of magnitude faster on disk.

2. Архитектура Spark

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

image

 

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

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

Затем он отправляет код вашего приложения (определяемый файлами JAR или Python, переданными вSparkContext) исполнителям. Наконец,SparkContext sends tasks to the executors to run.

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

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

image

 

3.1. Искровое ядро

Компонент Spark Core отвечает за все основные функции ввода-вывода, планирование и мониторинг заданий на искровых кластерах, диспетчеризацию задач, сетевое взаимодействие с различными системами хранения, восстановление после сбоев и эффективное управление памятью.

В отличие от Hadoop, Spark избегает хранения общих данных в промежуточных хранилищах, таких как Amazon S3 или HDFS, используя специальную структуру данных, известную как RDD (Resilient Distributed Datasets).

Resilient Distributed Datasets are immutable, a partitioned collection of records that can be operated on – in parallel and allows – fault-tolerant ‘in-memory’ computations.

СДР поддерживают два вида операций:

  • Преобразование - преобразование RDD Spark - это функция, которая создает новые RDD из существующих RDD. The transformer takes RDD as input and produces one or more RDD as output. Преобразования ленивы по своей природе, то есть они выполняются, когда мы вызываем действие

  • Преобразования действия создают RDD друг из друга, но когда мы хотим работать с фактическим набором данных, в этот момент выполняется действие. Таким образом,Actions are Spark RDD operations that give non-RDD values. Значения действий сохраняются в драйверах или во внешней системе хранения.

Действие - это один из способов отправки данных из Executor в драйвер.

Исполнители - это агенты, которые отвечают за выполнение задачи. В то время как драйвер представляет собой процесс JVM, который координирует работу и выполнение задачи. Некоторые из действий Spark считаются и собираются.

3.2. Spark SQL

Spark SQL - это модуль Spark для структурированной обработки данных. В основном он используется для выполнения SQL-запросов. DataFrame составляет основную абстракцию для Spark SQL. Распределенный сбор данных, упорядоченных по именованным столбцам, в Spark известен какDataFrame.

Spark SQL поддерживает выборку данных из разных источников, таких как Hive, Avro, Parquet, ORC, JSON и JDBC. Он также масштабируется до тысяч узлов и многочасовых запросов с использованием механизма Spark, который обеспечивает полную отказоустойчивость в середине запроса.

3.3. Spark Streaming

Spark Streaming - это расширение основного Spark API, которое обеспечивает масштабируемую, высокопроизводительную, отказоустойчивую обработку потоков потоков данных. Данные могут быть получены из нескольких источников, таких как сокеты Kafka, Flume, Kinesis или TCP.

Наконец, обработанные данные можно отправить в файловые системы, базы данных и живые панели мониторинга.

3.4. Spark Mlib

MLlib - это библиотека машинного обучения Spark (ML). Его цель - сделать практическое машинное обучение масштабируемым и легким. На высоком уровне он предоставляет такие инструменты, как:

  • Алгоритмы ML - общие алгоритмы обучения, такие как классификация, регрессия, кластеризация и совместная фильтрация

  • Функционализация - извлечение признаков, преобразование, уменьшение размерности и выбор

  • Трубопроводы - инструменты для построения, оценки и настройки ML Pipelines

  • Постоянство - сохранение и загрузка алгоритмов, моделей и конвейеров

  • Утилиты - линейная алгебра, статистика, обработка данных и т. Д.

3.5. Spark GraphX

GraphX is a component for graphs and graph-parallel computations. На высоком уровне GraphX ​​расширяет Spark RDD, вводя новую абстракцию Graph: направленный мультиграф со свойствами, прикрепленными к каждой вершине и ребру.

Для поддержки вычислений графов GraphX ​​предоставляет набор основных операторов (например,subgraph,joinVertices иaggregateMessages).

Кроме того, GraphX ​​включает в себя растущую коллекцию графовых алгоритмов и конструкторов для упрощения задач аналитики графов.

4. «Hello World» в Spark

Теперь, когда мы понимаем основные компоненты, мы можем перейти к простому проекту Spark на основе Maven -for calculating word counts.

Мы продемонстрируем работу Spark в локальном режиме, когда все компоненты работают локально на одном компьютере, где это главный узел, узлы-исполнители или автономный менеджер кластера Spark.

4.1. Maven Setup

Давайте настроим проект Java Maven сSpark-related dependencies в файлеpom.xml:


    
        org.apache.spark
    spark-core_2.10
    1.6.0
    

4.2. Количество слов - Spark Job

Теперь напишем задание Spark для обработки файла, содержащего предложения, и вывода отдельных слов и их количества в файл:

public static void main(String[] args) throws Exception {
    if (args.length < 1) {
        System.err.println("Usage: JavaWordCount ");
        System.exit(1);
    }
    SparkConf sparkConf = new SparkConf().setAppName("JavaWordCount");
    JavaSparkContext ctx = new JavaSparkContext(sparkConf);
    JavaRDD lines = ctx.textFile(args[0], 1);

    JavaRDD words
      = lines.flatMap(s -> Arrays.asList(SPACE.split(s)).iterator());
    JavaPairRDD ones
      = words.mapToPair(word -> new Tuple2<>(word, 1));
    JavaPairRDD counts
      = ones.reduceByKey((Integer i1, Integer i2) -> i1 + i2);

    List> 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, используя методflatmap, чтобы сначала преобразовать каждую строку в слова, разделенные пробелами, а затем сгладить вывод каждой обработки строки.

Мы снова применяем операцию преобразованияmapToPair, которая в основном отображает каждое вхождение слова в кортеж слов и количество 1.

Затем мы применяем операциюreduceByKey, чтобы сгруппировать несколько вхождений любого слова со счетчиком 1 в кортеж слов и суммировать счет.

Наконец, мы выполняем действие RDD collect, чтобы получить окончательные результаты.

4.3. Выполнение - Spark Job

Теперь давайте создадим проект с помощью Maven для созданияapache-spark-1.0-SNAPSHOT.jar в целевой папке.

Далее нам нужно отправить эту работу WordCount в Spark:

${spark-install-dir}/bin/spark-submit --class com.example.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 исполнителям.

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

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

5. Заключение

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

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