До сих пор кластер был готов заранее: два исполнителя по два ядра, переменная spark под рукой. В работе дата-инженера всё начинается раньше: скрипт надо отправить на кластер, попросить ресурсы и выставить настройки. От этих решений зависит, займёт ночной пересчёт десять минут или три часа. Разберём, как это устроено, и коротко посмотрим на MLlib, библиотеку машинного обучения Spark.
Как скрипт попадает на кластер
Скрипт PySpark отправляют командой spark-submit. В ней вы говорите, куда отправить, сколько ресурсов взять и что запустить:
spark-submit \
--master k8s://https://k8s.gonets.internal:6443 \
--deploy-mode cluster \
--name gonets-daily-revenue \
--num-executors 10 \
--executor-cores 4 \
--executor-memory 8g \
--driver-memory 2g \
--conf spark.sql.shuffle.partitions=80 \
daily_revenue.py --day 2026-06-30
--masterвыбирает менеджер кластера: Kubernetes, YARN или встроенныйspark://. Для отладки на ноутбуке пишутlocal[4]: всё в одном процессе на четырёх ядрах.--deploy-mode clusterзапускает драйвер внутри кластера, рядом с исполнителями. В режимеclientдрайвер живёт на машине, откуда вы отправили задание, например на сервере Airflow.--num-executors,--executor-cores,--executor-memoryзадают ресурсы: здесь 10 исполнителей по 4 ядра, всего 40 ядер, и по 8 ГБ памяти каждому.--confзадаёт любую настройку Spark, то же, чтоspark.conf.setв коде.
Вместо фиксированного числа исполнителей можно включить динамическое выделение: Spark сам попросит больше исполнителей на тяжёлой стадии и отдаст их, когда работа кончится.
Сколько просить
Несколько правил, которые сходятся у большинства команд:
- 4-5 ядер на исполнителя. Одно ядро на исполнителя плохо использует память и кэш, двадцать ядер на одного упираются в сборщик мусора JVM и ввод-вывод.
- Память на ядро. На каждую задачу нужны память под shuffle, сортировку и данные партиции. Ориентир 2-4 ГБ на ядро. Плюс запас на служебные нужды JVM: Spark добавляет к
executor-memoryещё около 10% сверху. - Партиций в 2-4 раза больше, чем ядер. Об этом был урок про партиционирование.
урок из курса
Урок из курса «Data Engineering». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.