Или как подобрать параметры SparkSession.
Продолжаем deep dive into 😄
Неделю назад для меня была загадка, почему при наличии ресурсов в очереди в Yarn мой DAG не стартует. Подождал, еще подождал, сходил на обед, а когда вернулся, DAG до сих пор не стартовал 😡
config('spark.dynamicAllocation.minExecutors', 'n')
Если тут вместо n стоит 0, то сессия может даже не стартовать при наличии ресурсов, если ваш DAG не представляет большой нагрузки.
😄 Чуть капнем вглубь и посмотрим на другие параметры.
Spark-джоб падает по памяти или работает слишком долго, и первое, что хочется сделать — накинуть ресурсов: больше памяти, больше ядер. Но если кластер ограничен (очередь, лимит на команду), то нужно подобрать параметры с умом.
Ключевое, на что смотреть:
spark.executor.memory — объём памяти на executor (например, 4g)
spark.executor.cores — число ядер на executor
spark.sql.shuffle.partitions — количество партиций при shuffle
😄 Зачем в этом разбираться?
Давай просто накинем ресурсов! Нет. Повторюсь:
Это спрашивают на собесах + нужно, если ваш кластер небольшой, а пользователей много.
😄 Определи ограничения
Перед тем как крутить SparkSession, нужно понять, какие у тебя есть лимиты:
Сколько всего памяти доступно на кластере (например, 64 GB)
Сколько CPU-ядер доступно (например, 16)
Используешь ли ты Dynamic Allocation? Если да — настрой minExecutors, maxExecutors
😄 Подбери executor'ы
Допустим, ты хочешь:
executor.memory = 8g
executor.cores = 4
Считаем:
по памяти: 64 GB / 8 GB = 8 executors
по ядрам: 16 cores / 4 = 4 executors
❗️Значит максимум — 4 executors, потому что упираемся в CPU.
😄 Настрой shuffle.partitions
По умолчанию Spark выставляет spark.sql.shuffle.partitions = 200 — это почти всегда не оптимально.
Где-то читал, что shuffle.partitions ≈ 2–3 × общее число ядер у executors (в другом источнике 1,5 × общее число ядер). Кому верить? Тут нужно крутить и смотреть на своем DAG.
Если у тебя 4 executors × 4 cores = 16 ядер
То поставь:
spark.sql.shuffle.partitions = 32–50
😄 Настрой Dynamic Resource Allocation
Думаю, что почти все работают с этой настройкой 😂
Если включён (spark.dynamicAllocation.enabled = true), то:
minExecutors — минимальное число executors (например, 2, а не 0!)
maxExecutors — максимум, который можно масштабировать
spark.conf.set("spark.dynamicAllocation.enabled", "true")
spark.conf.set("spark.dynamicAllocation.minExecutors", "2")
spark.conf.set("spark.dynamicAllocation.maxExecutors", "10")
😄 Пара задач с собесов:
Вопрос 1.
spark.executor.memory = 500g — это норм?
Вопрос 2.
У вас есть кластер с 96 GB RAM и 24 CPU.
Нужно, чтобы каждый executor получал 6 GB памяти и 3 ядра.
Сколько executors вы можете запустить одновременно?
Это база, которая проверяет, насколько вы погружены в общую архитектуру Spark.
😄 Ответы можете кидать в комменты. И другие вопросы, которые вам задавали по этой теме.
Ставь реакцию:
🔥 - я это знаю
🤔 - было полезно и надо в этом разобраться
#база_знаний