Повышаем производительность Spark: Broadcasting

Соединение нескольких таблиц является достаточно распространенной операцией в Spark. Как правило, при ее выполнении происходит перетасовка (shuffle), которая за счет перемещений данных между узлами оказывает влияние на производительность. Можно ли избежать этой дорогостоящей операции?

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

Давайте представим, что у нас существует таблица df_order, содержащая информацию о заказах. Кроме того, есть также и таблица df_city, включающая в себя информацию о городах, которые соответствуют заказу. И если даже в самих заказах миллионы строк и много столбцов, то, скорее всего, в таблице df_city число городов будет не очень высоким, к примеру, сотни строк. И если при добавлении информации о городах мы добавим к таблице заказов трансляцию (Broadcasting), никакой перетасовки не произойдет.

Важно отметить, что максимальный размер таблицы для трансляции составляет 8 Гб. Также Spark поддерживает изменение границы размеров этой таблицы, при которых Broadcasting станет выполняться автоматически. Реализовать это можно через параметр spark.sql.autoBroadcastJoinThreshold, который по дефолту равен 10 Мб.

Источник: https://towardsdatascience.com/apache-spark-performance-boosting-e072a3ec1179

P. S. Интересует Spark? Обратите внимание на специализированный курс по Spark в Otus.