使用spark.sql.autoBroadcastJoinThreshold时,Spark Driver不会释放内存

时间:2018-02-14 20:02:47

标签: apache-spark apache-spark-sql spark-dataframe

我遇到了异常行为,

我有一个查询(内部循环),其中我有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的新手。

1 个答案:

答案 0 :(得分:0)

查看堆栈跟踪,看起来广播的数据集大小约为16MB,因此您可能希望将广播阈值设置为高于16MB以查看它是否有效。

您提到的另一个选项是禁用广播,但您需要检查SQL的性能以确定是否存在任何不利影响。