gpt4 book ai didi

java - Spark 驱动程序出现 OutOfMemoryError - 配置 10Gb 时堆转储 1Gb

转载 作者:行者123 更新时间:2023-11-30 05:31:17 58 4
gpt4 key购买 nike

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

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

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

  1. 我用过这些great instructions关于收集 GC 统计数据并使用 gceasy.io 进行分析服务;它清楚地表明:
    • GC 后的最大堆使用量约为 1Gb。
    • 接近 OOM 时刻,“堆使用”图表几乎触及 1Gb 的最大值,并且大量 GC 事件无法影响该值。 在最佳状态下超出了 GC 开销限制
  2. 我使用过 MAT分析发生 OutOfMemoryError 后立即创建的堆转储。
    • 堆转储包含大约相同的 1Gb 数据。
    • 支配树显示其中一半以上被 UI 对象消耗。

This question的答案表明10Gb-1Gb=9Gb可能被JNI库使用;但显然 Spark 的核心并没有使用它;我也不是。

我用过this question的答案是尽量减少保留的 UI 数据。结果,我的应用程序成功运行。 但我还没有准备好放弃可以使用 Spark UI 探索的所有宝贵的调试数据。

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

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

最佳答案

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

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

我使用的是客户端模式。将设置从 Spark 上下文参数移至 Spark-submit 命令行参数解决了该问题。

附注“如果没有任何效果,请阅读手册”(c)。

关于java - Spark 驱动程序出现 OutOfMemoryError - 配置 10Gb 时堆转储 1Gb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57492945/

58 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com