Порядок объединения таблиц в Spark SQL для повышения производительности - PullRequest
1 голос
/ 20 июня 2020

Я новичок в Spark-SQL, чтобы читать Hive таблицы. Я хочу знать, как Spark выполняет многотабличный Join. Я где-то читал, что рекомендуется всегда держать таблицу наибольшая в верхней части порядка соединения и так далее, что способствует эффективности Join. Я читал, что в соединении Spark загружает первую таблицу (самую большую) в порядке памяти и передает другую таблицу, которая помогает в производительности соединения. Однако меня смущает, как эта стратегия повысит производительность, поскольку самая большая таблица (в большинстве случаев) не помещается в памяти и выливается на диск.

Кто-нибудь, пожалуйста, поясните и объясните механизм объединения, используемый Spark при объединении таблиц [large vs medium], [large vs small] и [large vs large] с точки зрения типов соединения (inner и outer) и Присоединяйтесь к выступлению. Я хочу знать передовые методы, которым следует следовать с точки зрения упорядочивания таблиц соединения для достижения оптимальной производительности для всех стратегий соединения (SMJ, ShuffleHa sh и Broadcast), используемых Spark. Предположим, что следующий запрос:

select 
a.id, 
b.cust_nm, 
c.prod_nm
from large_tab a
join medium_tab b
on a.id = b.id
join small_tab c
on a.pid = c.pid;

Примечание: мы используем Spark 2.4

Любая помощь приветствуется. Спасибо.

1 Ответ

1 голос
/ 21 июня 2020

Что касается порядка объединений, Spark предоставляет функциональные возможности для поиска оптимальной конфигурации (порядка) таблиц в объединении, но это связано с некоторыми настройками конфигурации (приведенный ниже код предоставляется в PySpark API):

  1. CBO - должен быть включен оптимизатор на основе затрат (в версии 2.4 он отключен по умолчанию)
spark.conf.set("spark.sql.cbo.enabled", True)
joinReorder должен быть включен (по умолчанию в 2.4 он выключен)
spark.conf.set("spark.sql.cbo.joinReorder.enabled", True)
Чтобы он работал как можно лучше, лучше сначала вычислить статистику для ваших таблиц. Это можно сделать следующим образом:
spark.sql("ANALYZE TABLE table_name COMPUTE STATISTICS FRO COLUMNS col1, col2, ...")

Здесь очень важно вычислить статистику, потому что на основе этого Spark оценит размер таблиц в объединении и соответствующим образом изменит их порядок. Чтобы получить еще более точные оценки, вы также можете включить вычисление гистограммы для столбцов (это также отключено по умолчанию в 2.4):

spark.conf.set("spark.sql.statistics.histogram.enabled", True)

Максимальное количество таблиц, для которых можно использовать это joinReorder можно управлять с помощью этой настройки

spark.sql.cbo.joinReorder.dp.threshold

, а значение по умолчанию - 12.

...