Что такое Apache Spark: место в экосистеме Big Data
Почему Spark появился, что именно он решает и где стоит в современном data-стеке.
Откуда взялся Spark¶
В 2004 году Google опубликовал статью о MapReduce. Apache Hadoop реализовал эту модель как open-source, и к 2010 году стал стандартом для обработки больших данных: HDFS хранит, MapReduce считает.
У MapReduce есть фундаментальная проблема - каждый промежуточный результат записывается на диск. Для SQL-запросов из нескольких JOIN это ещё терпимо. Для итеративных алгоритмов - катастрофа: машинное обучение с 100 итерациями означает 200 операций чтения/записи HDFS.
В 2009 году Matei Zaharia в Berkeley AMPLab начал работу над Spark. Ключевая идея: держать промежуточные данные в памяти кластера, на диск писать только при нехватке RAM. Результат одного из первых бенчмарков - логистическая регрессия на Hadoop: 110 секунд за итерацию, на Spark: 0.9 секунды. В 2013 году проект передан в Apache Software Foundation.
Что такое Spark - точное определение¶
Apache Spark - это unified analytics engine для крупномасштабной обработки данных.
Каждое слово важно:
- Unified - один движок для batch-обработки, SQL-аналитики, потокового streaming и машинного обучения. Не нужен отдельный стек для каждой задачи.
- Analytics - не СУБД, не файловая система, не планировщик. Только вычисления.
- Engine - абстракция поверх кластерных ресурсов. Spark не управляет кластером сам, он запрашивает ресурсы у YARN, Kubernetes или Mesos.
Главное: Spark не хранит данные. Он читает из внешних источников (HDFS, S3, PostgreSQL, Kafka), обрабатывает в памяти кластера и пишет результат обратно.
Место в современном data-стеке¶
В modern lakehouse-архитектуре Spark работает в паре с несколькими слоями:
| Слой | Инструменты | Роль |
|---|---|---|
| Хранение | MinIO, HDFS, S3 | Хранение байт |
| Table format | Apache Iceberg, Delta Lake | ACID, версионирование, метаданные |
| Catalog | Hive Metastore, REST Catalog | Схемы и партиционирование |
| Оркестровка | Apache Airflow | Расписание и зависимости |
| Вычисления | Apache Spark | Трансформации над данными |
Spark - инструмент трансформаций, не хранения и не оркестровки.
Компоненты Spark¶
Spark состоит из нескольких модулей поверх единого ядра:
| Модуль | Что делает | Реальное применение |
|---|---|---|
| Spark Core | RDD API, планировщик задач, управление памятью | Основа всего; напрямую редко |
| Spark SQL / DataFrame | SQL и DataFrame API через оптимизатор Catalyst | ~90% production кода |
| Structured Streaming | Streaming поверх DataFrame API | Kafka → Iceberg пайплайны |
| MLlib | Классификация, кластеризация, feature engineering | Feature engineering, batch inference |
| GraphX | PageRank, connected components | Узкоспециализированные задачи |
В Data Engineering задействованы первые три. MLlib применяют для feature engineering и batch scoring, но не для обучения моделей - для этого есть PyTorch и sklearn на отдельных GPU-машинах.
Spark в контексте альтернатив¶
Spark vs Hadoop MapReduce¶
| MapReduce | Spark | |
|---|---|---|
| Промежуточные данные | HDFS (диск) | RAM + spill на диск |
| Модель | Map + Reduce, 2 фазы | DAG произвольной глубины |
| Iterative ML | Катастрофически медленно | 10–100× быстрее |
| SQL | Hive (компилируется в MR-задания) | Spark SQL с Catalyst |
| Streaming | Отдельный Storm/Samza | Встроенный Structured Streaming |
MapReduce сегодня практически не используется в новых проектах. Если в компании есть Hadoop-кластер - Spark запускается поверх него через YARN.
Spark vs Apache Flink¶
| Spark | Flink | |
|---|---|---|
| Основная модель | Batch-first; streaming как micro-batch | Streaming-first; batch как частный случай |
| Streaming latency | Секунды (размер micro-batch) | Миллисекунды (true event-at-a-time) |
| State management | Watermarks + stateful ops | Полноценный RocksDB state backend |
| Экосистема | Огромная, зрелая, много библиотек | Меньше, но активно растёт |
Когда Flink: нужна sub-second latency или сложный stateful processing с богатым State API. Для типичного Data Engineer Spark покрывает 90% потоковых задач.
Spark vs DuckDB / Polars¶
| DuckDB / Polars | Spark | |
|---|---|---|
| Масштаб | Один процесс, ограничен ресурсами сервера | Кластер, терабайты |
| Query latency | Миллисекунды | Секунды (overhead на планирование задач) |
| Установка | pip install duckdb |
Кластер или Kubernetes |
| Подходит для | Аналитика до 100–500 GB | Batch > 100 GB или распределённые задачи |
Практическое правило: если данные помещаются на один сервер - рассмотрите DuckDB или Polars. Spark добавляет координационный overhead, который окупается только на реально больших объёмах. Этому посвящён отдельный модуль курса.
Когда выбирать Spark¶
Spark - правильный выбор:
- Batch ETL поверх сотен гигабайт и терабайт
- Medallion-пайплайны bronze → silver → gold в lakehouse
- Structured Streaming: Kafka → Iceberg с exactly-once гарантиями
- Feature engineering для ML на миллиардах строк
- Ad-hoc аналитика поверх Parquet/Iceberg через Spark SQL
- Когда нужен один инструмент для batch + streaming в одной команде
Spark - не лучший выбор:
- Sub-second latency → Apache Flink
- Интерактивные BI-запросы → ClickHouse, Trino
- Объёмы до 50–100 GB → DuckDB, Polars, pandas
- OLTP (инсерты по одной строке) → PostgreSQL напрямую
Spark 4.x: что изменилось¶
Курс ориентирован на Apache Spark 4.x (2024+). Ключевые отличия от 3.5:
- Spark Connect - тонкий клиент через gRPC: PySpark-код работает на удалённом кластере без локального Spark
- TransformWithState - новый stateful Streaming API, заменяет
mapGroupsWithState - Python 3.11+ как минимальная версия для PySpark 4.x
- Улучшена поддержка Pandas 2.x и Arrow 14+, быстрее Pandas UDF
- ANSI SQL по умолчанию - поведение при переполнении типов изменилось
Большинство DataFrame API обратно совместимы с 3.5.x - код из статей 2022–2023 годов в основном работает без изменений.
Итог¶
Spark занимает роль универсального вычислительного движка в data platform. Его сила не в скорости на одной машине (DuckDB быстрее на малых данных), а в горизонтальном масштабировании и глубокой интеграции с экосистемой: Iceberg, Kafka, Airflow, Hive Metastore, MLflow.
В следующем уроке разберём, как именно устроен кластер изнутри - Driver, Executor и Cluster Manager - и что происходит с кодом от момента запуска до получения результата.