Временные просмотры и ошибка автоматического трансляции - PullRequest
0 голосов
/ 29 сентября 2019

У меня есть запрос (приведенный ниже), и когда я его запускаю, иногда Spark выдает эту ошибку -

org.apache.spark.SparkException: Could not execute broadcast in 300 secs. You can increase the timeout for broadcasts via spark.sql.broadcastTimeout or disable broadcast join by setting spark.sql.autoBroadcastJoinThreshold to -1
1 statement failed.

Execution time: 5m 56s 

Мы извлекаем данные из источника и применяем несколько логических схем преобразования на разных этапах во временных представлениях.

Упрощенная версия запроса, который я выполняю, -

create temporary view my_date AS
select max(max_eff_dt) as eff_dt
from (
      select max(eff_dt) as max_eff_dt from tableA
      union
      select max(eff_dt) as max_eff_dt from tableB
      union
      select max(eff_dt) as max_eff_dt from tableC
      );

create temporary view AS
select a.x, b.x, c.y, dt.eff_dt
from tableA a
inner join tableB  b
on a.x = b.x
inner join tableC c
on b.y = c.y
cross join my_date dt
where a.join_dt < dt.eff_dt
and   b.join_dt < dt.eff_dt
and   c.join_dt < dt.eff_dt;

Однако Spark не выдает эту ошибку всегда, а только в определенные моменты времени.

Может кто-нибудь, пожалуйста, помогите мне понять причину этой ошибки и устранить ее. Хотя set spark.sql.autoBroadcastJoinThreshold = -1 заботится об ошибке, я хочу понять причину этой ошибки и как изменить мой код, чтобы избежать этого в будущем.
Кроме того, было бы здорово, если бы кто-то мог указать мне на любой онлайнресурсы о настройке производительности запросов Spark-SQL.

Пожалуйста, дайте мне знать, если требуется дополнительная информация об ошибке.

1 Ответ

0 голосов
/ 29 сентября 2019

Ошибка означает, что Spark передавал данные для некоторых из ваших объединений и не смог передать данные в течение 300 секунд. Этот порог 300 с является значением по умолчанию для внутренней настройки конфигурации, которую можно изменить следующим образом:

spark.conf.set("spark.sql.broadcastTimeout", n)

, где n - время в секундах. Увеличение этого порога - один из способов избежать этой ошибки. Также в зависимости от размера вашего кластера это может помочь настроить значение spark.sql.autoBroadcastJoinThreshold конфигурации. Установив значение -1, вы полностью отключите трансляцию. Значение по умолчанию для этого параметра - 10MB, поэтому вы также можете проверить, какое значение установлено в вашей среде (позвонив по номеру spark.conf.get("spark.sql.autoBroadcastJoinThreshold")), и настроить его. Когда Spark оценивает, что размер данных больше этого порога, Spark не будет транслировать и выберет другой алгоритм, в основном SortMergeJoin (при условии, что вы не использовали широковещательную подсказку в своем запросе). Если вы используете подсказку широковещания в запросе, Spark будет пытаться транслировать независимо от предполагаемого размера и может потерпеть неудачу, если размер данных слишком велик (либо из-за ошибки OOM, либо из-за ошибки, получаемой с таймаутом).

...