当前位置: 首页 > 知识库问答 >
问题:

Spark的驱动堆转储上的OutOfMemoryError为1GB,而配置了10GB

楮乐邦
2023-03-14

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

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

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

  • 我在收集GC统计信息并用gceasy.io服务进行分析方面使用了这些很好的说明;它清楚地表明:
    • GC之后的最大堆使用量约为1GB.
    • 接近OOM时刻时,“堆使用”图几乎达到了1GB的最大值,而大量的GC事件并没有影响到这一点。GC开销限制超出最佳值。
    • 堆转储包含大约相同的1GB数据。
    • 支配者树显示超过一半的数据被UI对象使用。

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

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

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

共有1个答案

邢高澹
2023-03-14

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

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

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

附言。“如果没有任何工作符合预期,请阅读手册”(c)。

 类似资料:
  • 问题内容: 我知道JVM参数。我也知道,这将要求堆转储。 问题: 如何确保我首先进行完整的堆转储, 然后 在转储完成后强制重新启动(或终止)?是我最好的选择吗? 问题答案: JVM将首先转储堆,然后执行OnOutOfMemoryError命令(证明)。

  • 我的数据集大小为10GB(例如Test.txt)。 我编写了pyspark脚本,如下所示(Test.py): 然后我使用下面的命令执行上面的脚本: 然后我得到如下错误: 请让我知道如何解决这个问题?

  • 问题内容: 我在标准Windows命令窗口中有一个正在运行的Java进程。即我已经运行’cmd’并在java -jar中键入… 我需要尽可能获得所有线程的完整堆栈转储。 我记得在Linux下,您可以通过quit命令上的选项将消息发送到JVM。 在此文件中为太阳状态 若要在Windows 95或Windows NT平台上生成堆栈跟踪,请在运行Java程序的窗口中输入键序列,或单击窗口上的“关闭”按钮

  • 我一直在分析我们服务的Java.lang.OutofMemoryError:Java堆空间,并试图通过Eclipse MAT工具挖掘堆转储。 我们的服务使用8G堆运行,生成的堆转储的大小只有500 MB。

  • 问题: 需要查看任何特定的配置单元属性吗? 请引导我。如有任何帮助,我将不胜感激

  • 问题内容: 我正在尝试诊断Sun One 9.1应用服务器中的PermGen内存泄漏问题。为此,我需要获取JVM进程的堆转储。不幸的是,JVM进程是Windows上运行的1.5版。显然,没有一种触发堆转储的方法支持该设置。我可以让JVM在内存耗尽或关闭时进行堆转储,但是我需要能够在任意时间进行堆转储。 经常提到的两种获取堆转储的方法是使用jmap或使用HotSpotDiagnostic MBean