Что такое Apache Spark: истоки и принципы работы

Apache Spark — фреймворк для работы с Big Data

Владимир Туров Владимир Туров Разработчик 3 августа 2022

Рассказываем про Apache Spark — фреймворк с открытым исходным кодом для обработки большого объема данных.

Изображение записи

Впервые термин «большие данные» появился в 2008 году в специальном выпуске журнала «Nature», посвященном ошеломительному росту количества обрабатываемых данных. Спустя год термин «выбрался» из академической среды в журналистику, а затем проник в сферу информационных технологий.

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

Обработка больших данных (Big Data)

Задолго до появления термина Big Data люди желали научить несколько компьютеров эффективно работать над одной задачей. Так появились парадигмы параллельных и распределенных вычислений. Идея распределенных вычислений на словах звучит просто: разбиваем большую задачу на ряд маленьких, отправляем доступным вычислителям и ждем результат. 

Читайте больше о том, что такое Big Data →

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

С поисковиков и началась история проекта Hadoop, который разместился под крылом Apache Software Foundation. История появления фонда проста: в 1993 году разрабатывался HTTP-сервер, ныне известный как Apache HTTP Server. Спустя пять лет группа разработчиков создала фонд для юридической защиты участников проектов с открытым исходным кодом имени Apache. 

Фреймворк домена Apache

Появление Apache Spark уходит истоками к проекту Hadoop, о котором мы кратко расскажем. 

В начале 2000-годов Дуг Каттинг (Doug Cutting) вдохновился публикацией о вычислительной концепции MapReduce, о которой мы расскажем ниже. Тогда Дуг был автором проекта Nutch — открытого фреймворка построения поисковых систем, написанного на языке программирования Java. Это положило начало проекту Hadoop, фреймворку для построения распределенных приложений.

В январе 2008 года Hadoop становится частью фонда Apache Software Foundation, а спустя полгода устанавливает мировой рекорд в стандартизированной задаче по сортировке большого объема данных. С этого момента проект приобретает известность и применяется в широком спектре задач в сфере информационных технологий.

Принципы работы Hadoop

В основе Hadoop лежит концепция MapReduce, названная в честь двух функций высшего порядка функционального программирования — map() и reduce(). Любая задача в данной концепции решается в два шага:

  1. Мастер-узел разбивает данные на фрагменты и отправляет их другим узлам кластера.
  2. Результат работы каждого узла отправляется мастеру, который объединяет данные в итоговый результат.

На деле реализация концепции сложнее, но общая идея сохранена. На текущий момент проект Hadoop состоит из следующих компонентов:

  • Hadoop Common — инструменты для работы с файловыми системами hadoop и командный интерпретатор с набором утилит,
  • Hadoop Distributed File System (HDFS) — распределенная файловая система, созданная хранить файлы большого размера,
  • Yet Another Resource Negotiator (YARN) — планировщик ресурсов и заданий,
  • Hadoop MapReduce — программный фреймворк для построения распределенных приложений.

Одна из особенностей Hadoop MapReduce — промежуточные данные вычислений хранятся на накопителях. Это снижает скорость доступа к данным, что неприемлемо для некоторых классов аналитических задач. Apache Spark был призван решить «медлительность» Hadoop.

Что такое Apache Spark

Spark — фреймворк с открытым исходным кодом для обработки большого объема данных, опубликованный в 2010 году румынским ученым Матеем Захария (Matei Zaharia). Спустя три года проект был передан фонду Apache. 

Apache Spark предлагает иной архитектурный подход, называемый RDD (resilient distributed dataset). В его основе лежат мультимножества, распределенные между узлами кластера. Кластер представляется как ацикличный направленный граф, где узлы кластера являются мультимножествами, а ребра графа — операциями. Для работы с RDD доступно несколько абстракций: Dataframe API и Dataset API.

Apache Spark не входит в фреймворк Apache Hadoop, однако имеет с ним совместимость. Узлы кластера можно запускать через YARN, а хранить данные на HDFS. Знание Hadoop необязательно: кластер Spark может быть запущен даже вручную, а для разработки и тестов можно выбрать псевдораспределенный режим, в котором каждый узел кластера занимает одно вычислительное ядро процессора. 

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

Преимущества Apache Spark

Начнем обзор с фундаментальных вещей. Apache Spark использует парадигму резидентных вычислений, то есть обрабатываемые данные хранятся в оперативной памяти, ускоряя многократный доступ к загруженным данным. Благодаря такому подходу Spark можно использовать в задачах, недоступных для Hadoop, — например, в машинном обучении.

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

Основой Spark является модуль Spark Core, написанный на языке программирования Scala. «Ядро» занимается запуском распределенных вычислений, планированием заданий и базовыми операциями ввода-вывода. Ядро предоставляет Java API для управления с помощью других JVM-совместимых языков программирования. Дополнительно предоставляются интерфейсы для Python, .NET и R. 

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

Список действий для получения текущего мультимножества — один из способов достижения отказоустойчивости в кластере. В случае частичной потери данных в кластере остается «инструкция» по восстановлению данных, которая «прозрачна» для конечного пользователя.

Действия над мультимножествами определяются программистом в функциональном стиле при разработке приложения в виде последовательности простых действий над одним или несколькими элементами.

Парадигма функционального программирования подходит не всем, поэтому рассмотрим другие модули для Spark.

Spark SQL

Многие аналитики используют в работе интерактивные запросы. Средства Spark Core не позволяют совершать запросы к хранящимся данным в режиме реального времени, более того, «ядро» требует навыков функционального программирования. 

В этом случае поможет модуль Spark SQL, который вводит поддержку языка запросов SQL для структурированных наборов данных. Spark SQL — это диалект SQL, который обладает множеством известных операторов и ключевых слов, свойственных диалектам реляционных баз данных. Тем не менее, в нем есть и уникальные синтаксические конструкции. Например, выражение для загрузки JSON-файла в Spark:

CREATE TEMPORARY TABLE people
    USING org.apache.spark.sql.json
    OPTIONS (path '/home/selectel/example.json')

Помимо интерактивного интерфейса командной строки, Spark SQL предоставляет ODBC/JDBC-интерфейсы, позволяющие корпоративным инструментам для анализа данных подключаться к Spark, как к классическим базам данных.

Spark Streaming

Устройства и программы современного мира генерируют огромное количество данных. Некоторые данные необходимо обрабатывать по мере их поступления. Для этого существует модуль Spark Streaming. 

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

Читайте больше про Apache Kafka →

Spark MLLib

Spark MLLib — это библиотека, реализующая алгоритмы машинного обучения и статистические алгоритмы на базе кластеров Apache Spark. Как упоминалось ранее, Spark использует парадигму резидентных вычислений, подходящую для задач машинного обучения. 

Разработка модуля MLLib началась вместе с разработкой Spark. Предполагалось, что MLLib заменит существующий проект для машинного обучения Apache Mahout. Использование распределенной архитектуры Spark позволило получить почти девятикратный прирост производительности по сравнению с Apache Mahout. 

После принятия Spark в проекты верхнего уровня Apache Mahout получил интерфейс для работы с Spark, а MLLib — значительное расширение функциональности. 

Graphx

Мы рассмотрели структурированные запросы, потоковую обработку и методы машинного обучения. Осталась теория графов. Модуль Graphx «закрывает» эту область.

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

Заключение

Итак, мы закончили высокоуровневый обзор проекта Apache Spark — его преимуществ, принципа работы, инструментов. В целом, его можно охарактеризовать как «швейцарский нож» из мира распределенных вычислений и больших данных. Совместимость с инструментами Apache Hadoop и наличие модулей обработки специфичных структур данных существенно расширяют область применения Spark.

Читайте также: