SparkException:无法及时执行广播

时间:2018-07-25 19:26:42

标签: scala apache-spark spark-streaming

我正在使用Spark结构化流式传输,以使用功能编写一些转换后的数据帧:

def parquetStreamWriter(dataPath: String, checkpointPath: String)(df: DataFrame): Unit = {
 df.writeStream
   .trigger(Trigger.Once)
   .format("parquet")
   .option("checkpointLocation", checkpointPath)
   .start(dataPath)
}

当我在代码中调用此函数的次数更少(写入1或2个数据帧)时,它可以正常工作,但是当我调用它多次(例如,在循环中写入15至20个数据帧时),我得到了以下异常,并且某些作业在数据块中失败:-

Caused by: org.apache.spark.SparkException: Could not execute broadcast in 
time. You can disable broadcast join by setting 
spark.sql.autoBroadcastJoinThreshold to -1.
at org.apache.spark.sql.execution.exchange.BroadcastExchangeExec.doExecuteBroadcast(BroadcastExchangeExec.scala:191)

我的转换有一个广播连接,但是我尝试删除代码中的连接广播,但出现了相同的错误。

我尝试将spark conf spark.sql.autoBroadcastJoinThreshold设置为-1。如错误所述,但再次遇到相同的异常。

你能建议我要去哪里吗?

2 个答案:

答案 0 :(得分:0)

很难判断是否看到执行计划(尤其不确定广播量),但是增加spark.sql.broadcastTimeout可能会有所帮助(请找到完整的配置描述here)。

答案 1 :(得分:-3)

  1. 这可以通过将 spark.sql.autoBroadcastJoinThreshold 设置为更高的值来解决

  2. 如果不知道特定数据帧的执行时间,则可以直接将spark.sql.autoBroadcastJoinThreshold设置为-1,即( spark.sql.autoBroadcastJoinThreshold -1 ),这将禁用执行数据帧的时间限制