使用 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)