apache spark
Apache Spark — это распределённый вычислительный фреймворк с открытым исходным кодом, разработанный в UC Berkeley AMPLab в 2009 году и переданный в Apache Software Foundation. Apache Spark предоставляет единый API для пакетной обработки данных, потоковой обработки в реальном времени, машинного обучения и графовых вычислений, выполняя задачи в 10–100 раз быстрее Hadoop MapReduce за счёт in-memory вычислений.
Архитектура Spark
Spark работает по модели master-worker. Driver Program — центральный процесс, содержащий логику приложения и координирующий выполнение. Cluster Manager (YARN, Kubernetes, Mesos или standalone) распределяет ресурсы. Executors — рабочие процессы на воркер-нодах, выполняющие задачи и хранящие данные в памяти.
Основная абстракция Spark — RDD (Resilient Distributed Dataset): неизменяемая, отказоустойчивая коллекция объектов, распределённая по кластеру. Поверх RDD построены более высокоуровневые API: DataFrame и Dataset.
Ключевые концепции
Lazy evaluation: трансформации над данными (map, filter, join) не выполняются немедленно — Spark строит граф вычислений (DAG). Фактическое выполнение запускается только при вызове action (collect, count, save). Это позволяет оптимизатору Catalyst строить эффективный план выполнения.
DAG Scheduler: преобразует логический план запроса в физический граф стадий. Стадии разделяются операциями shuffle — дорогостоящей передачей данных между партициями.
In-memory computing: промежуточные результаты хранятся в памяти executors, а не пишутся на диск, как в MapReduce. Это кардинально ускоряет итерационные алгоритмы (ML) и интерактивные запросы.
Компоненты Spark
- Spark SQL — SQL-интерфейс и API DataFrame/Dataset с оптимизатором Catalyst и code generator Tungsten
- Spark Streaming / Structured Streaming — потоковая обработка данных с micro-batch и continuous processing
- MLlib — библиотека машинного обучения: классификация, регрессия, кластеризация, рекомендации, feature engineering
- GraphX — граф-параллельные вычисления и алгоритмы на графах
Spark DataFrame API
DataFrame — основной API для работы с данными в современном Spark. Это распределённая таблица со схемой, аналогичная pandas DataFrame, но масштабирующаяся на петабайты. Optimizer Catalyst понимает структуру данных и генерирует оптимизированный байткод через Tungsten, что даёт производительность, сравнимую с нативным кодом.
PySpark
PySpark — Python API для Apache Spark. Позволяет писать Spark-приложения на Python, что делает Spark доступным для data scientists, привыкших к pandas и scikit-learn. PySpark DataFrames поддерживают преобразование в pandas с помощью toPandas() (для небольших результатов) и интеграцию с Arrow для эффективной сериализации.
Типичные применения
Spark используется для ETL-пайплайнов над большими данными в data lake, построения feature store для ML-систем, потоковой аналитики в реальном времени (Structured Streaming), обучения ML-моделей на распределённых данных (MLlib, интеграция с MLflow), интерактивных аналитических запросов через Spark SQL в Databricks или EMR.
Spark vs альтернативы
Flink обеспечивает более низкую задержку в потоковой обработке (true streaming vs micro-batch). dbt работает только с SQL и трансформациями в хранилище. Pandas/DuckDB достаточно для данных, помещающихся в память одной машины. Spark оптимален при объёмах данных, превышающих возможности одной машины, и при необходимости единой платформы для batch + streaming + ML.
Spark на Kubernetes и Delta Live Tables
Современный Spark всё чаще запускается на Kubernetes вместо YARN: spark-on-k8s обеспечивает лучшую изоляцию, эластичное масштабирование и интеграцию с cloud-native стеком. Spark Operator для Kubernetes упрощает запуск SparkApplication через Custom Resource. Managed-сервисы — Databricks, Amazon EMR, Google Dataproc — берут на себя управление кластером, позволяя сосредоточиться на разработке пайплайнов. Delta Live Tables (DLT) добавляет декларативное определение пайплайнов поверх Spark с автоматическим управлением зависимостями, quality controls и observability. Structured Streaming с Delta Lake обеспечивает exactly-once семантику для потоковых ETL-пайплайнов в production.
Частые вопросы
Нужен ли Spark для данных меньше 1 ТБ?
Необязательно. Для данных, помещающихся в память одной машины, pandas, DuckDB или ClickHouse дадут более быстрый и простой результат. Spark оправдан при распределённой обработке петабайтных датасетов или когда нужна единая платформа для batch + streaming + ML.
Чем Structured Streaming отличается от Spark Streaming?
Spark Streaming (DStream API) — устаревший подход на основе RDD. Structured Streaming — современный API, работающий с DataFrame/Dataset, поддерживает event-time processing, watermarks и exactly-once семантику. Рекомендуется использовать только Structured Streaming.
Что такое shuffle в Spark и почему он медленный?
Shuffle — перераспределение данных между партициями при операциях join, groupBy, repartition. Это требует записи данных на диск и передачи по сети, что дорого. Минимизируйте shuffle: используйте broadcast join для маленьких таблиц, фильтруйте данные до join, выбирайте ключи партиционирования совместимые с join-ключами.
Другие термины в теме «Инженерия данных»
Не хватает деталей?
Напишите, что уточнить по теме «apache spark» — это помогает улучшать материал и подсказывает, какие термины добавить дальше. Email необязателен: укажите, если хотите ответ только для вас (мы не шлём рассылки).