Apache Spark: с чего начать, что изучить и как практиковаться
Apache Spark — движок для распределённой обработки данных: он делит большой набор на партиции и обрабатывает их параллельно на многих ядрах или машинах. Инженер данных пишет на нём ежедневные расчёты витрин из файлов Parquet, аналитик выполняет запросы Spark SQL к таблицам, которые не помещаются в память ноутбука, data scientist готовит признаки по миллиардам событий. Освоить нужно модель выполнения (драйвер, экзекьюторы, ленивый план), DataFrame API на Python или Scala, партиционирование и shuffle, а также чтение плана запроса и интерфейса Spark UI.
Содержание

Код на PySpark внешне похож на pandas, и это главный источник ошибок у новичков. Чтение файла и десяток преобразований выполняются мгновенно: Spark пока лишь записывает план. Работа начинается, когда вы просите результат: сохранить таблицу, посчитать строки, показать первые записи. Тогда же всплывают ошибки, сделанные двадцатью строками выше. Поэтому учить Spark как ещё одну библиотеку функций бесполезно: сначала нужно понять, как он превращает код в задачи для кластера.
Какую задачу решает Spark и когда он лишний
Spark нужен, когда одна машина не справляется с объёмом или временем расчёта. Инженер данных каждую ночь читает сотни гигабайт событий из объектного хранилища, соединяет их со справочниками, считает агрегаты и записывает партиционированную таблицу. Аналитик пишет обычный SQL, который исполняется на кластере. Data scientist собирает обучающую выборку: окна по истории пользователя, частоты.
Если данные помещаются в память одного компьютера, Spark чаще мешает. Запуск JVM, планирование задач и пересылка данных между процессами на маленьком наборе занимают больше времени, чем сам расчёт, и для нескольких гигабайт проще pandas, Polars или DuckDB. Не подходит Spark и для ответа пользователю за миллисекунды: это инструмент пакетной и потоковой обработки, а не база данных для приложения.
Как Spark выполняет программу
Приложение состоит из драйвера и экзекьюторов. По документации Spark, драйвер — процесс, который запускает функцию main и создаёт контекст Spark, а экзекьютор — процесс на рабочем узле, который выполняет задачи и хранит данные в памяти или на диске. У каждого приложения свои экзекьюторы.
Данные разбиты на партиции, одна задача обрабатывает одну партицию. Трансформации (filter, select, join, groupBy) лишь описывают новый набор, действия (count, collect, write) запускают расчёт. Каждое действие порождает задание (job), задание делится на этапы (stage), а граница этапа проходит там, где данные перераспределяются между узлами. Метод explain() показывает план до запуска, Spark UI на порту 4040 — длительность каждой задачи и объём прочитанного.
RDD — исходная низкоуровневая модель: набор объектов, который вы обрабатываете своими функциями. DataFrame — таблица со схемой, и запросы к ней проходят через оптимизатор, который переставляет фильтры, отбрасывает лишние столбцы и выбирает способ соединения. В PySpark функции над RDD выполняются в процессе Python, и строки приходится пересылать туда из JVM, поэтому новый код пишут на DataFrame или Spark SQL. Оба варианта превращаются в один план, так что аналитик может начать со знакомого SQL. Structured Streaming применяет тот же API к непрерывному потоку, например из Kafka; за него берутся после пакетной обработки.
Shuffle и партиции: где теряется время
Узкие трансформации, вроде фильтра или нового столбца, выполняются внутри партиции. Широкие — groupBy, join, distinct, repartition — требуют собрать строки с одинаковым ключом на одном узле. Это shuffle, и руководство по RDD называет его дорогой операцией: запись на диск, сериализация, передача по сети.
После shuffle Spark SQL по умолчанию делит данные на 200 партиций (настройка spark.sql.shuffle.partitions) независимо от объёма. С версии 3.2.0 по умолчанию включено адаптивное выполнение запросов (AQE): по разделу о производительности Spark перестраивает план по фактической статистике и склеивает мелкие партиции. Но настройка spark.sql.adaptive.coalescePartitions.parallelismFirst по умолчанию включена, и тогда целевой размер партиции 64 МБ игнорируется, учитывается лишь минимум в 1 МБ. На загруженном общем кластере документация советует её выключать, чтобы не плодить мелкие задачи.
Учебный пример: чеки и карты лояльности
Ситуация вымышленная. Сеть магазинов хранит чеки за год в Parquet, инженер строит витрину выручки по регионам с данными из таблицы карт лояльности. Чеки без карты касса записывает с номером 0, таких треть. В Spark UI 199 задач этапа соединения завершаются за минуту, а последняя идёт сорок минут и иногда падает с нехваткой памяти.
Причина — перекос ключа (skew): все строки с номером 0 попадают в одну партицию. AQE умеет дробить такие партиции, но условия у него конкретные. По документации Spark, партиция считается перекошенной, только если она одновременно в пять раз больше медианной (skewedPartitionFactor = 5) и больше 256 МБ (skewedPartitionThresholdInBytes). К тому же механизм описан для соединений типа sort-merge: если заглушка соберётся в обычном groupBy, автоматического дробления документация не обещает.
Отсюда решения. Строки с номером 0 всё равно не найдут пару, их можно отфильтровать до соединения и добавить к итогу отдельно. Если таблица карт меньше 10 МБ (порог spark.sql.autoBroadcastJoinThreshold), Spark разошлёт её копию на каждый экзекьютор без shuffle большой таблицы. Проверка — в плане: BroadcastHashJoin вместо SortMergeJoin, а в Spark UI задачи ровные по длительности.
С чего начать и в каком порядке осваивать
Порядок идёт от модели выполнения к оптимизации. Если сразу взяться за настройки памяти, вы будете менять числа наугад; если сначала понять, где начинается этап и откуда берётся shuffle, большинство проблем станет видно в Spark UI. Заранее нужны SQL с соединениями и оконными функциями и базовый Python.
- Установите PySpark (pip install pyspark) и запустите сессию в локальном режиме local[*]. Для версии 4.2.0, вышедшей в июле 2026 года, документация требует Python 3.10+ и Java 17+.
- Освойте чтение и запись CSV и Parquet, select, filter, groupBy, join и оконные функции.
- Научитесь находить в explain() границы этапов, узлы Exchange и тип соединения.
- Разберите repartition и coalesce, запись с partitionBy и влияние числа файлов на чтение.
- Изучите AQE, broadcast-соединения, кэширование и причины нехватки памяти.
- Попробуйте spark-submit на кластере, затем Structured Streaming.
Кластер для учёбы не обязателен: локальный режим использует ядра ноутбука и показывает тот же Spark UI. В рабочей среде Spark запускают под встроенным менеджером Standalone, под Hadoop YARN или в Kubernetes, а облачную среду с ноутбуками даёт Databricks Free Edition — бесплатная версия для обучения с квотами.
Если нужна программа с проверкой заданий, посмотрите онлайн-курс Skillbox «Apache Spark». По обзору на Учи.Онлайн, это 6–8 недель, четыре модуля и десять уроков: DataFrame API, Spark SQL, управление ресурсами и оптимизация. Шесть работ складываются в проект по анализу логов веб-сайта, задания проверяет куратор, цена на 6 октября 2026 года — 45 000 ₽. Без Python и SQL начинать не стоит, а характеристики учебного кластера в обзоре не названы — уточните их у школы.
Упражнения и самопроверка
Каждое задание заставляет заглянуть внутрь Spark, а не только получить таблицу. Возьмите открытый набор на несколько миллионов строк и работайте локально.
- Напишите пять трансформаций, засеките время, затем добавьте count(). Объясните, почему первая часть заняла доли секунды.
- Выполните groupBy с выключенным и включённым AQE и сравните число задач после shuffle.
- Присвойте половине строк один ключ, соедините таблицу со справочником, найдите в Spark UI задачу-аномалию и устраните перекос двумя способами.
- Запишите результат с partitionBy до и после coalesce, посчитайте файлы и сравните время повторного чтения.
Результат сверяйте с расчётом в SQL или pandas на выборке, а по плану объясняйте, откуда взялся каждый Exchange.
Тем, кто работает в Data Science, подойдёт «Симулятор DS» от Karpov Courses. По обзору на Учи.Онлайн, это тренажёр по подписке на 90, 180 или 270 дней: больше ста бизнес-задач трёх уровней, среди инструментов — Spark, ClickHouse, MLFlow и DVC. Теории нет, на входе ждут Python с классами, понимание обучения моделей и простой SQL. Цены в обзоре приведены противоречиво, сверьте их у школы.
Типичные ошибки
Самая частая — collect() на большом наборе: метод собирает данные на драйвер, и руководство Spark предупреждает, что драйвер может исчерпать память; для просмотра есть take() и show(). Вторая — cache() везде подряд: кэш занимает память экзекьюторов и полезен лишь для набора, который читают несколько раз. Третья — маленькие файлы: каждая партиция последнего этапа пишет свой файл, и тысячи мелких файлов замедляют следующее чтение. Четвёртая — свои функции на Python там, где хватило бы встроенных.
Как Spark влияет на доход
Для инженера данных Spark обычно входит в требования вакансии наравне с SQL и Airflow, аналитику и data scientist он открывает задачи на сырых логах, которые иначе ушли бы инженерам. По калькулятору зарплат «Хабр Карьеры» на 6 октября 2026 года инженеры по данным с навыком Apache Spark получают 277 549 ₽ в месяц по 77 анкетам, а все инженеры по данным — 257 500 ₽ по 383 анкетам. Это вся Россия и все уровни; по методике сервиса анкеты берутся за скользящие полгода, доход считается как медианная зарплата плюс медианная премия.
Считать разницу надбавкой за Spark нельзя: выборка с навыком невелика, а навыки чаще заполняют опытные специалисты. Для data scientist со Spark калькулятор набрал всего 13 анкет — для вывода мало. Надёжнее сравнить вакансии своей должности в своём городе со Spark в требованиях и без него, отличая суммы до вычета налога от сумм на руки.
Как выбрать обучение
Проверьте, запускаете ли вы задания на кластере, учат ли читать план и Spark UI, есть ли задания на оптимизацию, а не только на синтаксис. Короткий курс подходит тем, кто уже пишет SQL и Python.
Аналитику, который только начинает, подойдёт программа «Аналитик данных» Хекслета. По обзору на Учи.Онлайн, в стандартном тарифе Spark нет: там SQL, Python с pandas, визуализация и три проекта. Курсы по Spark, Airflow, ClickHouse и основам машинного обучения входят в расширенный тариф — 12 месяцев, 99 000 ₽ вместо 134 000 ₽; объём модуля по Spark уточните у школы.
До покупки программы проверьте себя на локальной установке: выполните groupBy на паре миллионов строк и найдите в Spark UI этап после shuffle. Если захочется выяснить, почему задач на нём именно столько, учиться дальше стоит.
Если вы склоняетесь к профессии инженера данных целиком, сравните школы в рейтинге онлайн-школ по Data Engineering: это широкий рейтинг по инженерии данных, где Spark — одна из тем рядом с хранилищами и оркестрацией.