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

Posted

技术标签:

【中文标题】使用 spark.sql.autoBroadcastJoinThreshold 时 Spark Driver 不释放内存【英文标题】:Spark Driver does not release memory when using spark.sql.autoBroadcastJoinThreshold 【发布时间】:2018-02-14 20:02:46 【问题描述】:

我遇到了异常行为,

我有一个查询(循环内),其中我有超过 5 个表的内部连接,其中一个大约 200MB,所有其他的都在 10MB 以下(所有在循环开始时持久化,并且在循环结束时不持久化)。

每当我使用 spark.sql.autoBroadcastJoinThreshold(尝试默认,5MB、1MB 和 100KB)时,在多次运行相同的查询后,它会不断添加驱动程序内存并最终由于内存不足而失败(WARN TaskMemoryManager: Failed to allocate a页(16777216 字节),再试一次。)

但是,如果我用 spark.sql.autoBroadcastJoinThreshold=-1 尝试同样的事情,它可以正常工作没有任何问题。

我的 Spark(2.0.0) 配置是:

驱动内存:10g 执行器内存:20g 核心:3 节点数:5

(我想我提供的资源比需要的多,但即使我将执行程序内存减少到 4g,它也不起作用。 无论内存配置如何,它都会处理相同的次数。 )

PS:我没有手动创建任何广播变量。 我是 Spark 的新手。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于使用 spark.sql.autoBroadcastJoinThreshold 时 Spark Driver 不释放内存的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)