【问题标题】:Spark Driver does not release memory when using spark.sql.autoBroadcastJoinThreshold使用 spark.sql.autoBroadcastJoinThreshold 时 Spark Driver 不释放内存
【发布时间】: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 的新手。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-03-30
      • 2018-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      • 2011-11-16
      相关资源
      最近更新 更多