在运行Spark应用程序时,我有一个100%可复制的OutofMemoryError
(通常是由于超出了GC开销限制)。这大约发生在第700阶段。
由于错误堆栈总是包括.ui.
、TaskSchedulerImpl
等类,因此我得出结论,问题不在于执行器,而在于驱动程序进程本身。以下观察结果支持了这一结论:在OOM前几分钟,stdout
输出开始暂停一秒钟左右,暂停后立即打印大量行。
spark.driver.memory
配置为10G,但是使用的调试工具显示驱动程序只使用了1GB:
GC开销限制超出
最佳值。我使用这个问题的答案来最小化保留的UI数据。结果,我的应用程序成功运行。但是我还没有准备好放弃使用Spark UI可以探索的所有宝贵的调试数据。
此外,我无法找到任何解释的Spark的驱动程序内存模型。
问题是:我如何保留UI调试数据,而不在我的驱动程序上遇到OOMs?
实际问题是,尽管设置了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