Вступить в клуб →
сложнаявопросХранилища и распределённая обработка

Broadcast join работал на тесте и уронил драйвер в проде

Коллега ускорил соединение фактов со справочником, явно указав broadcast:

res = facts.join(F.broadcast(dim), on="client_id", how="left")

На тестовом контуре справочник занимал 20 МБ, джоб ускорился втрое. В проде справочник вырос до нескольких гигабайт, и джоб стал падать: сначала долгий сбор данных, потом OutOfMemory — по логам сначала на драйвере, при увеличении его памяти — на исполнителях.

Как объяснить и что делать?

  • Broadcast всегда выгоднее соединения с перемешиванием, потому что убирает shuffle; корректное решение — поднять память драйвера и исполнителей до размера справочника с запасом.
  • Broadcast собирает всю таблицу на драйвере и рассылает её копию каждому исполнителю, поэтому годится только для небольших справочников; подсказку надо убрать и вернуться к соединению с перемешиванием.
  • Причина в числе разделов у facts: их слишком мало, и после repartition по client_id трансляция пойдёт мимо драйвера, напрямую между исполнителями.
  • Broadcast несовместим с left join и молча деградирует в сбор обеих сторон на драйвере; при inner join с тем же справочником этой проблемы не возникло бы.

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела