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

在运行我的 Spark 应用程序时,我有 100% 的可重现性OutOfMemoryError(通常是由于超过了 GC 开销限制)。这大约发生在第 700 个阶段。

.ui.由于错误堆栈总是包含、等类TaskSchedulerImpl,因此我得出结论,问题不在于执行程序,而在于驱动程序进程本身。这个结论得到以下观察结果的支持:在 OOM 发生前几分钟,stdout输出开始暂停一秒左右,暂停后立即打印大量行。

spark.driver.memory配置为10G,但是使用的调试工具显示驱动只使用了1Gb:

  1. 我使用了这些关于收集 GC 统计数据并使用gceasy.io服务对其进行分析的重要说明;它清楚地表明:

  • GC 后的最大堆使用量约为 1Gb。

  • 接近 OOM 的时刻,'heap usage' 图几乎触及 1Gb 的最大值,而大量的 GC 事件未能影响到这一点。GC overhead limit exceeded处于最佳状态。

  • 我使用MAT分析了在 OutOfMemoryError 之后立即创建的堆转储。

    • 堆转储包含大约相同的 1Gb 数据。

    • 支配树显示其中一半以上被 UI 对象消耗。

我已经使用这个问题的答案来最小化保留的 UI 数据。结果,我的应用程序成功运行。但我还没有准备好放弃所有可以使用 Spark UI 探索的宝贵调试数据。

另外,我找不到任何关于 Spark 驱动程序内存模型的解释。

问题是:我如何保留 UI 调试数据并且不在我的驱动程序上遇到 OOM?

慕容708150
浏览 115回答 1
1回答

慕盖茨4494581

实际问题是驱动程序进程只使用了 1Gb 的内存,尽管设置了spark.driver.memory=10G.根据文档:在客户端模式下,不得通过 SparkConf 直接在您的应用程序中设置此配置(spark.driver.memory),因为此时驱动程序 JVM 已经启动。相反,请通过 --driver-memory 命令行选项或在您的默认属性文件中进行设置。我正在使用客户端模式。将设置从 Spark 上下文参数移动到 spark-submit 命令行参数解决了这个问题。PS“如果没有按预期工作,请阅读手册”(c)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java