我遇到了异常行为,
我有一个查询(内部循环),其中我有5个表的内部连接,一个大约200MB,所有其他都在10MB以下(所有这些都在循环开始时保持不变,并且在循环结束时不存在)。
每当我使用spark.sql.autoBroadcastJoinThreshold(尝试默认,5MB,1MB和100KB)时,多次运行相同的查询后,它会继续添加驱动程序内存并最终因内存不足而失败(WARN TaskMemoryManager:无法分配页面(16777216字节),再试一次。)
但是,如果我用 spark.sql.autoBroadcastJoinThreshold = -1 尝试相同的事情,它可以没有任何问题。
My Spark(2.0.0)配置为:
驱动程序内存:10g 执行者记忆:20g 核心:3 节点:5
(我想我提供的资源比需要的多,但即使我将执行程序内存减少到4g也不行。 无论内存配置如何,它都会处理相同的次数。 )
PS:我没有手动创建任何广播变量 我是Spark的新手。
答案 0 :(得分:0)
查看堆栈跟踪,看起来广播的数据集大小约为16MB,因此您可能希望将广播阈值设置为高于16MB以查看它是否有效。
您提到的另一个选项是禁用广播,但您需要检查SQL的性能以确定是否存在任何不利影响。