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 необязателен: укажите, если хотите ответ только для вас (мы не шлём рассылки).

Поделиться