ETL против ELT: как меняется архитектура данных в облачную эпоху

Apache Spark™: как устроен популярный инструмент для работы с большими данными
Apache Spark — стандарт в мире больших данных. Платформа сочетает высокую скорость, универсальность и мощный аналитический движок для решения задач от ETL и потоковой обработки до машинного обучения.
- Apache Spark™ — унифицированный движок для обработки больших данных, поддерживающий Python™, Scala, Java™, R и предоставляющий инструменты для SQL-запросов, машинного обучения и обработки потоковых данных.
- Spark возник в 2009 году в лаборатории AMPLab Калифорнийского университета в Беркли как проект для преодоления ограничений Apache Hadoop® и его модели MapReduce.
- Ключевой инновацией Spark стала абстракция Resilient Distributed Datasets (RDD), которая позволяет хранить данные в оперативной памяти и значительно ускоряет итеративные задачи по сравнению с Hadoop®.
- Среди основных сценариев использования Spark — ETL и инжиниринг данных, потоковая обработка данных, интерактивная аналитика и BI, подготовка данных для машинного обучения.
- Архитектура Spark построена по модели «ведущий — ведомые» и включает три основных компонента: программу-драйвер (координирующий процесс), исполнителей (рабочие процессы) и менеджер кластера (отвечает за выделение ресурсов).
- В архитектуре Lakehouse Spark часто выступает вычислительным слоем, обеспечивая ELT-преобразования, единый API для пакетной и потоковой обработки, SQL-аналитику и разделение хранения и вычислений.
- Yandex Cloud предлагает управляемые сервисы для работы с Spark: Yandex Data Processing (для экосистемы Hadoop + Spark) и Yandex Managed Service for Apache Spark™ (специализированный управляемый кластер Spark).
Постоянный рост данных из соцсетей, IoT-устройств и транзакционных систем показал, что традиционные базы данных достигли своего предела. Их архитектура оказалась не готова к петабайтным архивам и разнородным форматам, и это потребовало создания принципиально новых инструментов. Эту проблему решают распределённые системы, способные «распараллеливать» вычисления на тысячи узлов. Именно в этой области Apache Spark стал ключевой технологией.
Apache Spark — это унифицированный движок (его также называют платформой или фреймворком), который поддерживает языки программирования Python™, Scala, Java™ и R и предоставляет готовые инструменты для SQL-запросов, машинного обучения и обработки потоковых данных.
На практике Spark™ часто используют как вычислительный слой современной платформы данных: он помогает строить конвейеры ETL/ELT, обрабатывать потоки и выполнять SQL-аналитику поверх данных в объектном хранилище. Такой подход хорошо сочетается с архитектурой Lakehouse (табличные форматы вроде Apache Iceberg® или Delta Lake + объектное хранилище + масштабируемые вычисления Spark).
В статье разберём, как устроен Apache Spark: от истории создания до ключевых архитектурных концепций. Рассмотрим основные сценарии его использования, сравним с альтернативными решениями и опишем возможности нашей платформы для развёртывания и поддержки кластеров Spark.
История Apache Spark: от лаборатории до стандарта индустрии
Apache Spark появился в 2009 году. Он вырос из исследовательского проекта лаборатории AMPLab Калифорнийского университета в Беркли. Этим проектом руководил учёный в области информатики Матей Захария.
Команда разработчиков искала способ обойти недостатки Apache Hadoop® — платформы для распределённых вычислений — и её программной модели MapReduce. В то время MapReduce хорошо справлялась с пакетной обработкой, но модель была неэффективна для итеративных алгоритмов, выполняющих повторяющиеся вычисления, и интерактивных запросов, требующих быстрого ответа. После каждого шага MapReduce записывала промежуточные результаты на диск. Такой подход приводил к большим задержкам.
Это оказалось слишком медленно для задач машинного обучения. Алгоритмам в этой сфере часто нужен многократный доступ к одним и тем же данным, а постоянные дисковые операции сильно замедляли процесс.
Решением стала принципиально новая абстракция — Resilient Distributed Datasets (RDD). Это отказоустойчивая распределённая коллекция объектов, которую можно было хранить в оперативной памяти между вычислениями. Благодаря RDD и обработке в памяти итеративные задачи в Spark стали выполняться в десятки раз быстрее, чем в Hadoop®.
Идея оказалась прорывной. В 2010 году Spark стал проектом с открытым исходным кодом. В 2013 году его передали в Apache Software Foundation, а уже в 2014-м он получил статус проекта верхнего уровня. С тех пор Spark вырос в один из самых активных опенсорс-проектов в области больших данных. Его поддерживают тысячи организаций и независимых разработчиков.
Платформу продолжили развивать, чтобы повысить её производительность и удобство. Сначала появились DataFrame для работы со структурированными данными. Позже их объединили с типизированными Dataset. Это объединение открыло доступ к мощным оптимизаторам Catalyst и Tungsten. В версии 3.0 представили Adaptive Query Execution (AQE) — механизм, который динамически оптимизирует запросы прямо в процессе их выполнения.
Важным шагом стал выпуск Spark 4.0 в мае 2025 года. Новая версия улучшила SQL, добавила возможности для потоковой обработки данных и расширила языковую поддержку. Последнюю версию Spark 4.1.0 выпустили в сентябре 2025 года.
Основные сценарии использования Apache Spark
Универсальность Apache Spark позволяет применять его в разных областях. Платформа стала общепринятым подходом для многих задач по обработке больших данных. В 2026 году можно выделить четыре основных сценария её использования.
ETL и инжиниринг данных
Извлечение, преобразование и загрузка данных — ETL — остаётся одной из главных задач для Spark. Организации применяют его для построения сложных конвейеров данных.
Spark читает данные из множества источников. Он работает с реляционными базами данных и хранилищами NoSQL, то есть нереляционного типа. Фреймворк также обращается к файловым системам, таким как HDFS — распределённой файловой системе Hadoop, — и к облачным объектным хранилищам.
Фреймворк очищает данные, агрегирует, обогащает и преобразует их в нужный формат. Поддержка Spark SQL даёт инженерам данных возможность применять привычный синтаксис SQL для описания логики преобразований. Масштабируемость платформы позволяет обрабатывать петабайты данных в рамках одного задания.
Потоковая обработка данных
Анализ данных в реальном времени нужен многим современным приложениям. В Apache Spark для работы с непрерывными потоками предназначен модуль Structured Streaming. Он применяет тот же API, что используется и для пакетной обработки.
Потоковую обработку применяют в разных сценариях. Например, она помогает отслеживать финансовые транзакции для выявления мошеннических операций. Её также используют для анализа поведения пользователей на веб-сайтах, чтобы персонализировать контент. Ещё один пример — обработка данных с IoT-датчиков, которая нужна для предиктивного обслуживания оборудования.
Модуль Structured Streaming отличается низкой задержкой и поддерживает семантику exactly-once. Она гарантирует, что каждая запись в потоке будет обработана ровно один раз, исключая дублирование или потерю данных. Такие характеристики позволяют использовать модуль для критически важных приложений, работающих в реальном времени.
Интерактивная аналитика и BI
Spark SQL позволяет выполнять быстрые распределённые запросы стандарта ANSI SQL. Эту возможность используют для интерактивной аналитики: построения дашбордов и аналитики по требованию. Spark SQL часто работает быстрее многих традиционных хранилищ данных.
Аналитики могут подключаться к кластеру Spark через стандартные драйверы JDBC или ODBC. Это даёт им возможность использовать привычные BI-инструменты для анализа больших данных.
Spark универсален в работе с данными. Он поддерживает как структурированные форматы, например Parquet и Delta Lake, так и полуструктурированные, такие как JSON.
Практические сценарии: где Spark даёт максимальный эффект
Ниже — примеры типовых задач, где Apache Spark используют как вычислительный слой для пакетной и потоковой обработки, построения витрин и подготовки данных для ML.
|
Отрасль или команда |
Данные |
Бизнес-задача |
Что делает Spark (типичный пайплайн) |
Результат |
|
Ритейл, аналитика продаж |
Чеки, товары, акции, трафик, остатки |
Витрины для BI и планирования закупок |
ETL в DataFrame или Spark SQL: нормализация справочников, join чеков и промо, агрегаты по магазинам или категориям, расчёт KPI |
Быстрые витрины, единые метрики, меньше ручной подготовки данных |
|
Финтех, антифрод |
Транзакции, устройства, геоданные, события |
Выявление мошенничества почти в реальном времени |
Structured Streaming: чтение событий, обогащение профилем клиента, правила или скоринг, запись алертов и фичей в хранилище |
Снижение потерь, реакция на аномалии «по ходу потока» |
|
Промышленность, IoT |
Телеметрия датчиков, логи, ремонты |
Предиктивное обслуживание |
Streaming + batch: очистка или ресемплинг сигналов, расчёт оконных агрегатов, сбор фичей, обучение или переобучение моделей |
Меньше простоев, ремонт «по состоянию», а не по графику |
|
Маркетинг, продуктовая аналитика |
Клики, просмотры, события приложений |
Персонализация и сегментация |
Расчёт поведенческих признаков, построение сегментов, подготовка датасетов для рекомендаций |
Рост конверсии, единый слой признаков |
|
Логистика |
Заказы, статусы, маршруты, GPS |
Оптимизация сроков и маршрутов |
Пакетная обработка больших исторических наборов, объединение источников, расчёт метрик SLA, подготовка данных для моделей ETA |
Стабильнее сроки, прозрачность качества доставки |
|
Data Science, ML-платформы |
Фичи, лейблы, датасеты |
Единый конвейер подготовки данных и обучения |
Разработка функциональных возможностей в Spark, разбиение тестирования, MLlib или интеграция с TensorFlow или PyTorch, запись фичей в табличный формат |
Воспроизводимость и масштабируемость ML-пайплайнов |
Внутренняя архитектура и основные концепции
Архитектура Apache Spark построена по модели «ведущий — ведомые». Работу приложения координируют три основных компонента:
Программа-драйвер (Driver Program). Это центральный координирующий процесс, выступающий в роли ведущего. Он запускает основную функцию main () приложения и создаёт SparkContext — точку входа для взаимодействия с кластером. Драйвер преобразует код в логический и физический планы выполнения, а затем распределяет задачи между исполнителями.
Исполнители (Executors). Это ведомые рабочие процессы. Они запускаются на узлах кластера и выполняют задачи, которые назначил драйвер. Исполнители обрабатывают данные в своих разделах и хранят их в памяти или на диске, если включено кеширование.
Менеджер кластера (Cluster Manager). Отвечает за выделение ресурсов для приложения Spark. Платформа может работать с разными менеджерами кластеров:
- Standalone — встроенный простой менеджер кластера Spark.
- Apache YARN — менеджер ресурсов Hadoop.
- Kubernetes® — система оркестрации контейнеров. Этот вариант становится всё более популярным для запуска Spark в облачных средах.
Абстракции данных: RDD, DataFrame и Dataset
Spark использует для работы с данными три ключевые абстракции: RDD, DataFrame и Dataset. Они различаются уровнем оптимизации и контролем типов данных.
RDD остаётся основой Spark, но современная разработка в основном использует DataFrame и Dataset. Эти абстракции предлагают более высокий уровень оптимизации и производительности, а также упрощают работу со структурированными данными.
RDD
Resilient Distributed Dataset, или RDD, — фундаментальная низкоуровневая абстракция Spark. Она представляет собой неизменяемую, то есть немодифицируемую, распределённую коллекцию данных. Эта коллекция разделена на части — партиции.
Главное преимущество RDD — отказоустойчивость. Её обеспечивает механизм отслеживания происхождения данных, известный как lineage.
Если какая-то партиция теряется, Spark её воссоздаёт. Для этого он повторяет всю цепочку преобразований с самого начала. Работа с RDD происходит через функциональный API. Он включает трансформации, такие как map и filter, и действия, например collect или count.
DataFrame
Следующий уровень абстракции — DataFrame. Это распределённая коллекция данных, которая структурирована в виде таблицы с именованными столбцами. Такой формат похож на таблицы в реляционных базах данных.
В отличие от RDD, DataFrame использует высокоуровневый API. Его оптимизирует движок Spark SQL Catalyst. Spark «понимает» структуру данных в DataFrame и может построить более производительный план выполнения запросов. В современных версиях платформы DataFrame является псевдонимом для нетипизированной коллекции Dataset[Row].
Dataset
Dataset объединяет преимущества RDD и DataFrame. Это строго типизированная коллекция объектов JVM — виртуальной машины Java, — которая доступна в Scala и Java. Абстракция сочетает безопасность типов, как у RDD, с производительностью и оптимизациями Spark SQL, как у DataFrame.
Такой подход позволяет находить ошибки типизации на этапе компиляции. Это значительно повышает надёжность кода.
Принципы вычислений в Spark: отложенная модель и DAG
Spark использует модель отложенных вычислений — lazy evaluation. Операции не выполняются мгновенно, они делятся на два типа: трансформации и действия. Такой подход позволяет платформе сначала построить оптимальный план для реализации команд:
- Трансформации — это инструкции, которые преобразуют данные. Они не запускают сам процесс, а только формируют его логику. Spark выстраивает её в направленный ациклический граф — Directed Acyclic Graph (DAG), который служит планом будущих вычислений.
- Реальные вычисления запускает только команда-действие. С этого момента Spark последовательно выполняет несколько шагов. Сначала оптимизатор Catalyst преобразует логический план графа в наиболее эффективный физический. Затем планировщик DAG разделяет граф на отдельные этапы вычислений. После этого он распределяет готовые задачи между исполнителями, которые физически запускают их на узлах кластера.
Ключевую роль в этом разделении на этапы играет перемешивание данных, которое необходимо для операций join и groupBy. Они требуют, чтобы потоки данных перераспределялись между узлами.
Перемешивание — ресурсоёмкая операция, поэтому она служит естественной границей между этапами вычислений. Именно такая модель отложенных вычислений позволяет Spark глубоко анализировать и оптимизировать процесс обработки данных ещё до его физического запуска.
Технические возможности Apache Spark и инструменты
Apache Spark — это платформа, которая состоит из ядра и нескольких библиотек верхнего уровня. Такая архитектура позволяет строить сложные приложения, комбинируя разные типы обработки данных в одной системе.
Основные компоненты Apache Spark
Spark Core
Предоставляет базовую функциональность: абстракцию RDD, управление памятью, планирование задач и восстановление после сбоев. Служит основой для всех остальных компонентов.
Spark SQL
Модуль для работы со структурированными данными через абстракции DataFrame и Dataset. Позволяет выполнять ANSI SQL-запросы, использует оптимизатор Catalyst и проект Tungsten для высокой производительности.
Structured Streaming
Высокоуровневый API для потоковой обработки данных в реальном времени. Использует движок Spark SQL и API DataFrame/Dataset, обеспечивая отказоустойчивость и семантику exactly-once, о которой мы говорили выше.
MLlib
Библиотека машинного обучения. Содержит распределённые реализации алгоритмов (классификация, регрессия и другие) и утилиты для построения ML-конвейеров, позволяя масштабировать обучение моделей.
GraphX
Компонент для графовых вычислений. Расширяет RDD, добавляя абстракцию графа и операторы для манипулирования графовыми структурами. Используется для анализа соцсетей или построения рекомендаций.
Apache Spark редко используют изолированно, обычно он часть современной экосистемы больших данных. Для построения полноценной платформы Spark интегрируют с различными системами хранения, управления кластером и форматами данных.
Системы хранения
Spark может работать с широким спектром систем хранения:
-
Hadoop Distributed File System (HDFS) — распределённая файловая система Hadoop. Исторически Spark часто разворачивали вместе с Hadoop и использовали HDFS в качестве основного хранилища.
-
Облачные объектные хранилища. В облачных средах стандартом стали объектные хранилища, например Yandex Object Storage. Они предлагают высокую масштабируемость, долговечность и экономическую эффективность. Такой подход позволяет отделить вычисления от хранения и независимо масштабировать кластеры Spark и само хранилище.
Менеджеры кластера
Spark использует менеджеры кластера для управления ресурсами и оркестрации задач:
-
Apache YARN. В экосистеме Hadoop YARN — стандартный менеджер ресурсов.
-
Kubernetes. В последние годы Kubernetes стал предпочтительной платформой для запуска Spark, особенно в облаках. Он предлагает лучшую изоляцию ресурсов и унифицированный подход к управлению рабочими нагрузками. Использование Spark в Kubernetes упрощает развёртывание и масштабирование приложений.
Форматы данных
Эффективность обработки данных в Spark сильно зависит от используемых форматов файлов.
Apache Parquet™ — колоночный (столбцовый) формат хранения данных. Он оптимизирован для аналитических запросов. Такой способ хранения позволяет считывать только нужные столбцы и обеспечивает эффективное сжатие данных.
Архитектура Lakehouse и табличные форматы
Архитектура Lakehouse объединяет преимущества хранилищ и озёр данных. Она позволяет выполнять SQL-запросы и транзакции поверх данных, которые хранятся в озере. Для реализации этой архитектуры применяют специальные табличные форматы:
-
Delta Lake — фреймворк хранения с открытым исходным кодом, который обеспечивает ACID-транзакции, масштабируемую обработку метаданных и унификацию пакетной и потоковой обработки. Работает поверх существующих озёр данных и тесно интегрирован со Spark.
-
Apache Iceberg — открытый формат таблиц для очень больших аналитических наборов данных. Поддерживает ACID-транзакции, эволюцию схемы и «путешествие во времени» — доступ к предыдущим версиям данных.
Spark в архитектуре Lakehouse: роль и ценность
Lakehouse — это подход, при котором данные хранятся в масштабируемом объектном хранилище (озере данных, Data Lake), но доступны как управляемые таблицы с транзакциями и схемой (как в хранилище данных, Data Warehouse). На практике Lakehouse обычно состоит из трёх уровней:
- Хранилище: объектное хранилище, где лежат файлы (часто Parquet).
- Табличный слой: форматы таблиц вроде Apache Iceberg или Delta Lake, которые добавляют ACID-транзакции, эволюцию схемы и версионирование.
- Вычислительный слой: движок, который читает или пишет эти таблицы и выполняет преобразования.
Apache Spark часто становится вычислительным слоем Lakehouse, потому что он закрывает сразу несколько задач одним стеком:
- ELT для «бронзы — серебра — золота» (medallion architecture): очистка сырых данных → нормализация → витрины и датасеты для бизнес-аналитики или машинного обучения.
- Единый API для пакетной и потоковой обработки: можно обрабатывать исторические данные и поток (Structured Streaming) и писать результат в те же Lakehouse-таблицы.
- SQL-аналитика поверх озера: Spark SQL помогает строить витрины и делать ad-hoc-анализ по данным в табличном формате.
- Разделение хранения и вычислений: данные живут в объектном хранилище, а кластеры Spark масштабируются независимо под ETL, поток, машинное обучение или аналитические запросы.
Сравнение Spark с другими фреймворками
Apache Spark занимает доминирующее положение в обработке больших данных, но существуют и альтернативы:
|
Фреймворк |
Основное назначение |
Ключевые отличия от Spark |
Типичный пользователь или сценарий |
|
Hadoop MapReduce |
Пакетная обработка больших данных (предшественник Spark) |
Производительность: Spark до 10–20 раз быстрее за счёт обработки в памяти Универсальность: MapReduce выполняет только пакетную обработку. Spark объединяет пакетную и потоковую обработки, SQL и ML |
Исторические системы. Spark — де-факто современный стандарт |
|
Apache Flink® |
Потоковая обработка данных с низкой задержкой |
Модель: Flink® — настоящий потоковый движок (обработка по событию). Spark использует микропакеты Задержка: Flink обеспечивает задержку в десятки миллисекунд — ниже, чем у Spark |
Приложения, требующие реакции в реальном времени: финансовый мониторинг, обнаружение мошенничества и т. д. |
|
Dask |
Параллельные вычисления для масштабирования экосистемы Python (pandas, NumPy) |
Интеграция: Dask нативно расширяет библиотеки Python. Spark — движок на базе JVM со своим API Производительность: Spark обычно быстрее для SQL и ETL. Dask лучше для сложных нестандартных вычислений на Python |
Датасаентисты в Python, которые хотят масштабировать существующий код |
Выбор фреймворка зависит от конкретных задач и требований к задержке.
Apache Spark в Yandex Cloud
Управление кластерами Apache Spark — сложный процесс. Он требует настройки, мониторинга и масштабирования инфраструктуры. Мы предлагаем управляемые сервисы, чтобы упростить эту задачу.
Yandex Data Processing и Yandex Managed Service for Apache Spark™: как выбрать
Оба варианта позволяют запускать задания Apache Spark в облаке, но отличаются фокусом.
|
Критерий |
Yandex Data Processing |
Yandex Managed Service for Apache Spark™ |
|
Основной фокус |
Экосистема Hadoop + Spark в одном управляемом кластере |
Специализированный управляемый кластер Spark |
|
Когда подходит лучше всего |
Нужны компоненты Hadoop-стека рядом со Spark (например, HDFS/YARN/Hive) или уже есть процессы под Hadoop |
Нужен Spark как основной compute-движок для ETL, Streaming, SQL или ML, в том числе для Lakehouse-подхода |
|
Типовые сценарии |
Наследуемые Hadoop-пайплайны, миграции с on-premises Hadoop, задачи, завязанные на сервисах экосистемы |
Современные пайплайны Spark, витрины на объектном хранилище, обработка потоков, подготовка датасетов для машинного обучения |
|
Хранение данных (типовая схема) |
HDFS и/или объектное хранилище |
Объектное хранилище + табличный формат (Iceberg или Delta) как основа Lakehouse |
|
Результат для команды |
Удобно, если нужен именно «комбайн» Hadoop + Spark |
Удобно, если нужен быстрый старт и масштабирование именно Spark-задач |
Практическое правило выбора:
-
Если у вас уже есть или нужен Hadoop-стек целиком, чаще выбирают Yandex Data Processing.
-
Если вы строите современную платформу данных или Lakehouse и Spark — основной вычислительный слой, чаще выбирают Yandex Managed Service for Apache Spark™.
Ключевые преимущества управляемых сервисов
- Быстрое развёртывание. Можно быстро создать готовый к работе кластер Spark нужной конфигурации.
- Гибкая настройка под нагрузки. Пакетная трансформация, потоковая обработка, машинное обучение, аналитические запросы.
- Масштабирование ресурсов. Возможность адаптироваться под рост или падение нагрузки и оптимизировать затраты.
- Простое администрирование. Инструменты мониторинга и логирования снижают долю рутины.
Наши управляемые сервисы позволяют сосредоточиться на решении бизнес-задач и анализе данных. Управление инфраструктурой Spark при этом мы берём на себя.
Выводы и рекомендации
Apache Spark — универсальный движок для больших данных: он закрывает ETL, потоковую обработку, SQL-аналитику и подготовку данных для машинного обучения в едином стеке.
Что важно учитывать при внедрении:
- В большинстве задач оптимальный уровень — DataFrame или Spark SQL. RDD остаётся для специальных случаев.
- Производительность часто упирается в shuffle, join и партиционирование — это ключевые точки оптимизации.
- Для платформы данных всё чаще выбирают Lakehouse: объектное хранилище + Iceberg или Delta + Spark как compute-слой.
С чего начать:
- Определите сценарий (пакетный ETL, потоковая обработка, ad-hoc SQL, подготовка датасетов для машинного обучения).
- Выберите управляемый сервис под ваш контекст: Hadoop-экосистема (Yandex Data Processing) или специализированный Spark (Yandex Managed Service for Apache Spark™).
- Для Lakehouse заложите основу: хранение в объектном хранилище, табличный формат и конвейер «бронза — серебро — золото».
В этой статье:
- История Apache Spark: от лаборатории до стандарта индустрии
- Основные сценарии использования Apache Spark
- Внутренняя архитектура и основные концепции
- Технические возможности Apache Spark и инструменты
- Spark в архитектуре Lakehouse: роль и ценность
- Сравнение Spark с другими фреймворками
- Apache Spark в Yandex Cloud
- Выводы и рекомендации
