Почему большой кластер Spark не спасает от нехватки памяти драйвера. Объясняем сбор результата в один процесс и способы уменьшить итоговую выгрузку.
Много машин, одна точка сбора
Команда увеличила вычислительный кластер, но обработка снова завершилась ошибкой памяти. Кажется странным: ресурсов стало больше. Однако распределённая система не означает, что любой её шаг автоматически использует память всех машин. Иногда большой результат в конце пытаются собрать в одном процессе — и именно там возникает ограничение.
В Spark такой процесс может быть драйвером: он управляет выполнением приложения. Чтобы понять проблему, полезно отделить распределённую обработку от способа получения результата. Это разные решения. Большой набор можно успешно обработать на нескольких узлах, но не суметь целиком вернуть в одну программу.
Чем занимается драйвер
В обычном описании архитектуры Spark драйвер координирует работу, а процессы-исполнители выполняют задачи и хранят необходимые им данные. Исполнителей может быть несколько, но их суммарная память не превращается автоматически в память драйвера. Аналогия — группа кладовщиков и один небольшой стол диспетчера.
Обзор архитектуры Apache Spark описывает эти роли отдельно. Аналогия полезна только для понимания: реальные способы запуска отличаются, а память нужна драйверу не исключительно для итоговых строк. Здесь рассматриваем конкретный случай, когда большой результат собирают в одном месте.
Условный пример со складом
Представим, что десять работников разобрали по сто коробок каждый. На участках помещается весь объём, но на стол диспетчера можно поставить только двадцать коробок. Добавление ещё пяти работников ускорит часть работы, но не позволит разместить тысячу коробок на прежнем столе.
В задаче данных роль коробок играют записи итогового набора. Если нужен только общий объём продаж по десяти регионам, нет необходимости приносить диспетчеру каждую отдельную покупку. Сначала можно подготовить небольшой итог на рабочих участках, а затем передать его пользователю. Этот пример иллюстрирует организацию результата, а не точный расчёт памяти Spark.
Почему размер файла не даёт готового ответа
Компактный файл на диске может занимать больше места после чтения и превращения в объекты программы. Поэтому нельзя уверенно обещать, что выгрузка размером один гигабайт поместится в один гигабайт свободной памяти. Кроме самих значений нужны служебные структуры, и часть памяти уже занята другой работой.
В документации PySpark о сборе результата отдельно предупреждается: весь собранный набор загружается в память драйвера, поэтому ожидаемый результат должен быть небольшим. Увеличивать ресурсы без понимания размера и назначения выгрузки — слабая замена этому ограничению.
Выберите, что должно выйти из обработки
Сначала уточните потребителя. Для графика часто нужен небольшой агрегированный результат. Для проверки качества может хватить ограниченного образца. Для передачи полного массива другой системе может подойти сохранение распределённого результата во внешнее хранилище. Эти варианты решают разные задачи и не являются взаимозаменяемыми.
Образец не доказывает отсутствие редких ошибок во всём наборе. Сводка не заменяет детали, если дальше нужна проверка отдельных операций. Поэтому уменьшать данные следует осмысленно. Общий принцип распределения работы разбирается в статье как Spark распределяет обработку.
Что проверить до добавления ресурсов
Выясните, где именно возникла нехватка памяти: в драйвере или у исполнителей. Затем найдите этап, на котором распределённый набор превращается в локальный результат. Сопоставьте его объём с тем, что действительно требуется пользователю, и проверьте, не переносится ли вся таблица ради нескольких итоговых показателей.
Не стоит ожидать, что кэш автоматически устранит эту проблему. Он решает другую задачу — повторное использование промежуточных данных; подробнее об этом в материале когда полезен кэш Spark. Если большой локальный результат действительно необходим, его ресурсы планируют отдельно. Возможность расширить кластер не отменяет ограничений отдельного процесса.
Что изучить дальше
Продолжить обучение можно по программе PySpark для инженеров и аналитиков данных. Сопоставьте её содержание со своей задачей и текущей подготовкой.


