Зачем Spark раздаёт маленькую таблицу всем узлам

Объясняем broadcast в Spark без кода: зачем небольшую справочную таблицу копируют рабочим узлам, когда это помогает и где упирается в память.

Небольшой справочник раздаётся нескольким рабочим узлам

Большой список и маленький справочник

Компания обрабатывает миллионы покупок и хочет добавить к каждой название региона магазина. Покупок много, а справочник регионов короткий. Если рабочие машины постоянно пересылают покупки друг другу ради сверки со справочником, часть времени уйдёт на перемещение данных, а не на полезную работу.

Другой вариант — дать каждой рабочей машине собственную копию небольшого справочника. Тогда она сопоставит свои покупки с регионами локально. В Spark такую раздачу небольшой стороны соединения называют broadcast. Это способ организовать обмен между узлами, а не способ сохранить итоговый отчёт.

Почему это может быть быстрее

В распределённой обработке крупные данные часто разделены между несколькими машинами. Передача большого массива по сети затратна. Если маленькую таблицу можно разослать один раз и использовать рядом с каждой частью большого массива, перемещать сам большой массив бывает не нужно.

Официальное руководство Spark по производительности описывает широковещательную раздачу небольшой таблицы как одну из стратегий соединения. Это не обещание ускорения для любого набора: выбор зависит от размеров, доступной памяти и других условий выполнения.

Условный пример со складами

Представьте пять складов с тысячами накладных и один короткий список кодов регионов. Проще раздать каждому складу копию списка, чем везти все накладные в одно место ради расшифровки кода. Каждый склад дополнит свои документы и передаст готовый результат дальше. В этом условном примере копий справочника станет пять.

Если справочник содержит уже не десятки, а миллионы строк, копировать его на каждый склад может оказаться дороже. Помимо передачи, каждой машине нужно место для своей копии. Поэтому слово «маленький» определяется доступными ресурсами и реальным размером данных, а не названием таблицы.

Не путать с общей перестановкой данных

Когда Spark перегруппировывает части данных между рабочими машинами, это называют shuffle. Раздача небольшого справочника помогает в некоторых соединениях уменьшить такую перестановку большого набора. Что происходит при перемещении данных вообще, отдельно разобрано в статье про shuffle в Spark.

Описывая broadcast, важно не утверждать, что он полностью исключает любые сетевые передачи: маленькую сторону тоже надо распространить. Документация Spark об общих переменных отдельно объясняет хранение копии значения на рабочих узлах. Здесь речь о понятном принципе, а не о настройке конкретного способа выполнения.

Когда стоит проверить выбранную стратегию

Если соединение таблиц работает медленно, сначала выясните размеры обеих сторон и посмотрите, сколько данных передаётся между машинами. Затем оцените, поместится ли небольшой справочник в памяти каждого исполнителя и подходит ли такая стратегия для формы соединения. После изменения проверьте фактическое время и потребление памяти.

Большой кластер не превращает память отдельной машины в бесконечную. Похожее ограничение на другой стороне обработки объясняет статья о памяти драйвера Spark. Осваивать распределённую обработку и выбор таких решений помогает курс PySpark для инженеров и аналитиков.

Почему автоматический выбор тоже надо проверять

Spark умеет подбирать стратегию соединения по известным ему сведениям о данных. Но сведения могут не отражать текущий размер таблицы, а рабочая нагрузка меняется. Поэтому появление новой справочной строки, расширение поля или рост числа записей способны изменить разумный выбор. Не стоит считать вчерашнюю удачную стратегию вечным правилом.

Сравнивайте результат на типичном наборе, а не только на маленькой тестовой выборке. Если время сократилось, но память рабочих машин приблизилась к пределу, решение остаётся хрупким. Цель — устойчиво выполнить задачу, а не выиграть один замер.

Курс по теме

Подходящая программа для дальнейшего изучения темы: PySpark для инженеров и аналитиков данных.

PySpark для инженеров и аналитиков данных
Курс
Доступ сразу
PySpark для инженеров и аналитиков данных

Разработчик PySpark — это инженер, который обрабатывает большие объемы данных с помощью распределённых вычислений и строит масштабируемые системы обработки данных.

С нуля до junior
Теория и практика
Диплом по окончании
12 990
₽/мес
УЗНАТЬ ПОДРОБНЕЕ

Источники

Читайте также

Обучить команду или нанять специалиста по данным: как выбрать
47

Обучить команду или нанять специалиста по данным: как выбрать

Как руководителю определить, какие навыки развивать внутри команды, когда нужна новая роль и почему обучение и найм часто дополняют друг друга.
Вертикальное и горизонтальное масштабирование данных: в чём разница
46

Вертикальное и горизонтальное масштабирование данных: в чём разница

Когда системе добавляют мощность одного сервера, когда делят работу между несколькими и почему увеличение ресурсов само по себе не решает любую проблему.
Журнал изменений данных: как выяснить, кто и когда изменил набор
42

Журнал изменений данных: как выяснить, кто и когда изменил набор

Что можно узнать из журнала действий с данными, как он помогает разбирать ошибки и почему его записи не показывают всю историю сами по себе.

Занятия проходят
в Нова Дата СДО

Вебинары, практика и общение с преподавателем — в одном окне браузера.

Посмотреть интерфейс платформы
Календарь обучения в Нова Дата СДО
Курсы студента в Нова Дата СДО
Редактор кода для практики в Нова Дата СДО
Вебинары и расписание Ваши курсы Код в браузере
Нова Дата СДО — в реестре российского ПОРеестровая запись № 34931
Заявка отправлена
Отправим вам подборку курсов в течение 5 минут. С вами также свяжется наш специалист и даст карьерную консультацию.
Персональный промокод
На курс «Инженер по парсингу данных»
Введите код при оплате, чтобы применить скидку к программе.