Всегда ли spill на диск это плохо
Что проверяют
Понимаете ли вы, что spill это штатный механизм защиты от падения, а не авария. Интервьюер хочет услышать, где проходит граница между нормой и проблемой и по каким метрикам вы её определяете. Следом обычно просят рассказать, как лечить spill из-за перекоса данных.
Как отвечать
Начните с определения. В Spark spill случается, когда сортировке, агрегации или join не хватает execution memory: часть данных сериализуется на локальный диск исполнителя, а потом сливается обратно. Без этого задача упала бы с OOM, внешняя сортировка в шаффле изначально рассчитана на такой сценарий.
Дальше разделите случаи:
- приемлемо: умеренный spill в тяжёлой ночной агрегации, особенно на локальных SSD. Добавить память всему кластеру ради минуты на батче часто дороже, чем её потерять;
- плохо: spill на каждой стадии, spill в разы больше входных данных, spill в одной-двух задачах при нуле в остальных. Последнее почти всегда перекос по ключу;
- как смотреть: в Spark UI на странице стадии колонки
Spill (Memory)иSpill (Disk)и распределение времени задач по перцентилям. Максимум сильно выше медианы подтверждает перекос.
Инструменты: больше партиций через spark.sql.shuffle.partitions (по умолчанию 200), AQE с объединением мелких партиций и spark.sql.adaptive.skewJoin.enabled для перекошенных join, broadcast маленькой таблицы вместо шаффла, соление ключа, отбор колонок и фильтры до шаффла. Та же логика есть в базах: в PostgreSQL EXPLAIN ANALYZE покажет Sort Method: external merge, что лечится work_mem для конкретного запроса, а в Snowflake профиль отдельно показывает spill в удалённое хранилище, и он заметно хуже локального.
Где спотыкаются
Путают spill с shuffle write. Шаффл пишет на диск всегда, так он устроен, а spill означает нехватку памяти внутри задачи.
Первым делом увеличивают spark.executor.memory. При перекосе это не помогает: одна огромная партиция всё равно не влезет, а кластер станет дороже.
Смотрят на суммарный spill по джобе, а не на распределение по задачам. Тот же объём, ровно размазанный по тысяче задач, и тот же объём в одной задаче это две разные ситуации.