До сих пор каждая задача Spark жила внутри своей партиции: отфильтровать строки, поправить значения. Партиции друг о друге не знали, и задачи шли параллельно без всякой связи. Но многие вопросы так не решить. Чтобы посчитать, сколько раз слово «курьер» встречается во всех отзывах, слова из всех партиций надо свести вместе. Эта операция называется shuffle, и от неё зависит скорость почти любого задания Spark.
Сортировочный центр
Почта города собирает письма из сотен ящиков. В каждом ящике письма во все районы вперемешку. Чтобы разнести их, письма везут на сортировочный центр и раскладывают по районам: все письма в «Центр» в одну стопку, в «Уралмаш» в другую. Каждое письмо проделывает путь через весь город, и это самая долгая часть доставки.
Shuffle в Spark устроен так же. Каждая задача раскладывает свои строки по ключу на кучки, пишет их на диск, и задачи следующего шага забирают по сети свою кучку от каждого.
Узкие и широкие зависимости
У каждого преобразования есть зависимость от родителя.
Узкая зависимость: каждая партиция результата получается из одной партиции родителя. Так работают map, filter, flatMap. Данные никуда не едут, шаги склеиваются в одну задачу.
Широкая зависимость: партиция результата собирается из многих партиций родителя. Так работают reduceByKey, groupByKey, join, сортировка. Без shuffle тут не обойтись.
На широкой зависимости задание делится на стадии. Первая стадия читает данные и записывает кучки для shuffle, вторая забирает их и считает дальше. Поэтому в прошлых уроках у группировки было две стадии.
Меньше писем на сортировку
Сколько строк поедет через shuffle, зависит от операции. groupByKey отправляет каждую пару (слово, 1) как есть: если слово «курьер» встретилось в партиции двести раз, двести пар поедут по сети. reduceByKey сначала складывает пары внутри партиции и отправляет одну пару ("курьер", 200). Отсюда правило: для сумм и счётчиков берите reduceByKey, а не groupByKey.
урок из курса
Урок из курса «Data Engineering». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.