我正在使用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。如错误所述,但再次遇到相同的异常。
你能建议我要去哪里吗?
答案 0 :(得分:0)
很难判断是否看到执行计划(尤其不确定广播量),但是增加spark.sql.broadcastTimeout
可能会有所帮助(请找到完整的配置描述here)。
答案 1 :(得分:-3)
这可以通过将 spark.sql.autoBroadcastJoinThreshold 设置为更高的值来解决
如果不知道特定数据帧的执行时间,则可以直接将spark.sql.autoBroadcastJoinThreshold设置为-1,即( spark.sql.autoBroadcastJoinThreshold -1 ),这将禁用执行数据帧的时间限制