为了账号安全,请及时绑定邮箱和手机立即绑定

Spark 驱动程序上的 OutOfMemoryError - 配置 10Gb 时堆转储 1Gb

Spark 驱动程序上的 OutOfMemoryError - 配置 10Gb 时堆转储 1Gb

慕容708150 2023-06-04 19:45:34
在运行我的 Spark 应用程序时,我有 100% 的可重现性OutOfMemoryError(通常是由于超过了 GC 开销限制)。这大约发生在第 700 个阶段。.ui.由于错误堆栈总是包含、等类TaskSchedulerImpl,因此我得出结论,问题不在于执行程序,而在于驱动程序进程本身。这个结论得到以下观察结果的支持:在 OOM 发生前几分钟,stdout输出开始暂停一秒左右,暂停后立即打印大量行。spark.driver.memory配置为10G,但是使用的调试工具显示驱动只使用了1Gb:我使用了这些关于收集 GC 统计数据并使用gceasy.io服务对其进行分析的重要说明;它清楚地表明:GC 后的最大堆使用量约为 1Gb。接近 OOM 的时刻,'heap usage' 图几乎触及 1Gb 的最大值,而大量的 GC 事件未能影响到这一点。GC overhead limit exceeded处于最佳状态。我使用MAT分析了在 OutOfMemoryError 之后立即创建的堆转储。堆转储包含大约相同的 1Gb 数据。支配树显示其中一半以上被 UI 对象消耗。我已经使用这个问题的答案来最小化保留的 UI 数据。结果,我的应用程序成功运行。但我还没有准备好放弃所有可以使用 Spark UI 探索的宝贵调试数据。另外,我找不到任何关于 Spark 驱动程序内存模型的解释。问题是:我如何保留 UI 调试数据并且不在我的驱动程序上遇到 OOM?
查看完整描述

1 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

实际问题是驱动程序进程只使用了 1Gb 的内存,尽管设置了spark.driver.memory=10G.

根据文档:在客户端模式下,不得通过 SparkConf 直接在您的应用程序中设置此配置(spark.driver.memory),因为此时驱动程序 JVM 已经启动。相反,请通过 --driver-memory 命令行选项或在您的默认属性文件中进行设置。

我正在使用客户端模式。将设置从 Spark 上下文参数移动到 spark-submit 命令行参数解决了这个问题。

PS“如果没有按预期工作,请阅读手册”(c)。


查看完整回答
反对 回复 2023-06-04
  • 1 回答
  • 0 关注
  • 114 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信