在运行我的 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?
慕盖茨4494581
相关分类