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 с тем же справочником этой проблемы не возникло бы.
