Что такое Apache Spark: место в экосистеме Big Data

Почему Spark появился, что именно он решает и где стоит в современном data-стеке.

core

Откуда взялся 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 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 - и что происходит с кодом от момента запуска до получения результата.