我有一个查询(如下所示),当我运行它时,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查询性能调整的任何在线资源,那将是很棒的。
请让我知道是否需要有关该错误的其他信息。
答案 0 :(得分:0)
该错误表示Spark正在为您的某些联接广播数据,而没有设法在300秒内广播数据。此300s阈值是内部配置设置的默认值,您可以按以下方式更改:
#selector(hideKeyboard(_:))
其中spark.conf.set("spark.sql.broadcastTimeout", n)
是时间,以秒为单位。增加此阈值是避免此错误的一种方法。另外,根据群集的大小,可能有助于调整n
配置的值。通过设置值-1,您将完全禁用广播。此设置的默认值为spark.sql.autoBroadcastJoinThreshold
,因此您也可以检查环境中设置的值(通过调用10MB
)并调整该值。当Spark估计数据大小大于此阈值时,Spark将不会广播,并且将选择其他算法,主要是SortMergeJoin(假设您在查询中未使用广播提示)。如果在查询中使用广播提示,则Spark将尝试广播而不管估计的大小如何,并且如果数据大小太大(由于OOM错误或由于超时导致的错误),Spark可能会失败。