Открыть сервис

Spark

Spark — это универсальный фреймворк с открытым исходным кодом для распределённой обработки больших данных, разработанный в Калифорнийском университете в Беркли и впоследствии переданный под управление Apache Software Foundation. Основное назначение Spark — выполнение быстрых вычислений над данными произвольного объёма и структуры, включая пакетную обработку, потоковую аналитику, машинное обучение и работу с графами, без необходимости записи промежуточных результатов на диск.

История

Проект Spark был начат в 2009 году в лаборатории AMPLab (Algorithms, Machines, and People Lab) Калифорнийского университета в Беркли под руководством Матея Захарии. Первоначально Spark разрабатывался как исследовательская система, призванная решить проблему медленной работы MapReduce при итеративных алгоритмах и интерактивных запросах. Ключевым нововведением стала концепция устойчивых распределённых наборов данных (RDD — Resilient Distributed Datasets), позволяющая хранить данные в оперативной памяти и переиспользовать их между операциями.

В 2010 году исходный код Spark был опубликован под лицензией BSD. В 2013 году проект был передан Apache Software Foundation, а в 2014 году стал одним из самых активных проектов фонда, получив статус Top-Level Project. В 2015 году была выпущена версия 1.3, в которой появился модуль Spark SQL, а затем — Spark Streaming, MLlib и GraphX. В 2016 году вышла версия 2.0, ознаменовавшая переход на более высокоуровневый API — Dataset/DataFrame и унифицированный оптимизатор Catalyst. К 2020-м годам Spark стал де-факто стандартом для обработки больших данных в корпоративной среде, вытеснив классический Hadoop MapReduce во многих сценариях.

Ключевые концепции

Устойчивые распределённые наборы данных (RDD)

RDD — это основная абстракция Spark, представляющая собой неизменяемую коллекцию объектов, разделённую на партиции и распределённую по узлам кластера. RDD могут быть созданы из файловых систем (HDFS, S3), локальных коллекций или других RDD. Операции над RDD делятся на два типа:

DataFrames и Datasets

Начиная с версии 2.0, Spark рекомендует использовать более высокоуровневые API — DataFrame и Dataset. DataFrame — это распределённая коллекция строк с именованными столбцами, аналогичная таблице в реляционной базе данных. Dataset — типизированная версия DataFrame для языков со статической типизацией (Scala, Java). Оба API используют оптимизатор Catalyst для автоматического повышения производительности запросов.

Ленивые вычисления

Spark выполняет вычисления отложенно: все трансформации записываются в граф зависимостей (DAG — Directed Acyclic Graph), и реальное выполнение начинается только при вызове действия. Это позволяет оптимизировать план выполнения, объединяя узкие трансформации в одну стадию и минимизируя перемещение данных.

Кластерный менеджер

Spark может работать в различных режимах развёртывания:

Архитектура

Spark состоит из следующих компонентов:

Драйвер (Driver)

Главный процесс, отвечающий за выполнение пользовательской программы. Драйвер создаёт SparkContext (или SparkSession в современных версиях), планирует выполнение задач и координирует работу исполнителей.

Исполнители (Executors)

Рабочие процессы, запущенные на узлах кластера. Каждый исполнитель выполняет задачи (tasks), хранит данные в памяти (кэш) и передаёт результаты обратно драйверу.

Кластерный менеджер

Отвечает за выделение ресурсов (памяти, ядер) для приложения Spark.

SparkSession

Начиная с версии 2.0, SparkSession объединяет все функциональные возможности Spark (SQL, Streaming, MLlib) в единую точку входа. Для создания приложения используется объект SparkSession.builder.

Компоненты экосистемы

Spark SQL

Модуль для работы со структурированными данными. Позволяет выполнять SQL-запросы, читать данные из JDBC-источников, Parquet, Avro, JSON и других форматов. Включает оптимизатор Catalyst и механизм выполнения Tungsten.

Spark Streaming

Модуль для обработки потоков данных в реальном времени. В классической реализации использует микропакетный подход (DStreams), разбивая непрерывный поток на небольшие пакеты. Начиная с версии 2.3, появилась Structured Streaming — более высокоуровневый API, основанный на DataFrames, с поддержкой exactly-once семантики и оконных операций.

MLlib (Machine Learning Library)

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

GraphX

API для обработки графовых структур и выполнения графовых алгоритмов (PageRank, поиск кратчайших путей, кластеризация графов). GraphX использует RDD в качестве базового представления вершин и рёбер.

Преимущества и недостатки

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

Недостатки

Применение

Spark используется в широком спектре задач обработки данных:

Среди крупных пользователей Spark — такие компании, как Alibaba, Tencent, Netflix, Uber, Pinterest, а также многие государственные и исследовательские организации.

Интересные факты

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →