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 делятся на два типа:
- Трансформации (transformations) — ленивые операции, возвращающие новый RDD (например,
map,filter,flatMap,join). Вычисления не выполняются до момента вызова действия. - Действия (actions) — операции, запускающие вычисления и возвращающие результат в драйвер или записывающие данные на диск (например,
count,collect,saveAsTextFile).
DataFrames и Datasets
Начиная с версии 2.0, Spark рекомендует использовать более высокоуровневые API — DataFrame и Dataset. DataFrame — это распределённая коллекция строк с именованными столбцами, аналогичная таблице в реляционной базе данных. Dataset — типизированная версия DataFrame для языков со статической типизацией (Scala, Java). Оба API используют оптимизатор Catalyst для автоматического повышения производительности запросов.
Ленивые вычисления
Spark выполняет вычисления отложенно: все трансформации записываются в граф зависимостей (DAG — Directed Acyclic Graph), и реальное выполнение начинается только при вызове действия. Это позволяет оптимизировать план выполнения, объединяя узкие трансформации в одну стадию и минимизируя перемещение данных.
Кластерный менеджер
Spark может работать в различных режимах развёртывания:
- Standalone — встроенный менеджер кластера, не требующий внешних систем.
- YARN (Hadoop) — интеграция с менеджером ресурсов Hadoop.
- Kubernetes — поддержка контейнерной оркестрации.
- Mesos — устаревший вариант, редко используемый в современных развёртываниях.
Архитектура
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 в качестве базового представления вершин и рёбер.
Преимущества и недостатки
Преимущества
- Высокая производительность — за счёт хранения данных в оперативной памяти (in-memory) и оптимизации планов выполнения.
- Универсальность — единый фреймворк для пакетной, потоковой и интерактивной обработки.
- Простота использования — высокоуровневые API (DataFrame, SQL) снижают порог входа.
- Богатая экосистема — интеграция с Hadoop, Hive, HBase, Cassandra, Kafka, AWS S3, Azure Blob и другими системами.
- Открытый исходный код — активное сообщество, регулярные обновления и обширная документация.
Недостатки
- Потребление памяти — при работе с большими объёмами данных может требоваться значительный объём оперативной памяти.
- Сложность настройки — для достижения максимальной производительности требуется ручная настройка параметров (количество партиций, размер кэша, управление сериализацией).
- Отсутствие собственной файловой системы — Spark не хранит данные, а использует внешние хранилища (HDFS, S3, локальная файловая система).
- Проблемы с производительностью на маленьких данных — для небольших объёмов данных накладные расходы на запуск кластера могут превышать выгоду от распределённых вычислений.
Применение
Spark используется в широком спектре задач обработки данных:
- Аналитика и отчётность — построение ETL-пайплайнов, агрегация логов, расчёт бизнес-метрик.
- Машинное обучение — обучение моделей на больших объёмах данных, пакетный вывод (batch inference).
- Обработка потоков — мониторинг событий, обнаружение аномалий, обработка данных IoT.
- Графовый анализ — анализ социальных сетей, рекомендательные системы, поиск путей в транспортных сетях.
- Научные вычисления — обработка данных геномики, астрономии, физики высоких энергий.
Среди крупных пользователей Spark — такие компании, как Alibaba, Tencent, Netflix, Uber, Pinterest, а также многие государственные и исследовательские организации.
Интересные факты
- Название «Spark» не является акронимом; оно было выбрано как короткое и запоминающееся слово, символизирующее скорость и искру вычислений.
- В 2014 году Spark установил рекорд производительности в тесте Daytona GraySort, обработав 100 ТБ данных за 23 минуты на 206 узлах (в 3 раза быстрее, чем Hadoop MapReduce).
- Spark активно используется в российской IT-индустрии: в банках (Сбербанк, ВТБ), ритейле (Яндекс, Ozon), телекоммуникациях (МТС, Билайн) и государственных проектах.
Источники
- Zaharia, M. et al. (2012). Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing. USENIX NSDI.
- Apache Spark Documentation. (2024). Overview. spark.apache.org/docs/latest/
- Karau, H. et al. (2015). Learning Spark: Lightning-Fast Big Data Analysis. O'Reilly Media.
- Chambers, B. & Zaharia, M. (2018). Spark: The Definitive Guide. O'Reilly Media.
- Armbrust, M. et al. (2015). Spark SQL: Relational Data Processing in Spark. SIGMOD Conference.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →