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

Spark应用程序-Java。lang.OutOfMemoryError:Java堆空间

赵飞语
2023-03-14

我使用的是Spark独立单机,128G内存,32核。以下是我认为与我的问题相关的设置:

spark.storage.memoryFraction     0.35
spark.default.parallelism        50
spark.sql.shuffle.partitions     50

我有一个Spark应用程序,其中有1000个设备的循环。对于每个循环(设备),它准备特征向量,然后调用MLLib的k-Means。在循环的第25次到第30次迭代(处理第25次到第30次设备)时,它遇到了错误“Java.lang.OutOfMemoryError:Java堆空间”。

我试着从0.7到0.35进行记忆练习,但没有效果。我还尝试将并行/分区设置为200,但没有成功。JVM选项是“-Xms25G-Xmx25G-XX:MaxPermSize=512m”。我的数据大小只有2G左右。

这是堆栈跟踪:

java.lang.OutOfMemoryError: Java heap space
  at java.util.Arrays.copyOf(Arrays.java:2271)
  at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
  at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
  at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
  at java.io.ObjectOutputStream$BlockDataOutputStream.write(ObjectOutputStream.java:1841)
  at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1533)
  at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508)
  at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
  at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
  at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
  at scala.collection.mutable.HashMap$$anonfun$writeObject$1.apply(HashMap.scala:138)
  at scala.collection.mutable.HashMap$$anonfun$writeObject$1.apply(HashMap.scala:136)
  at scala.collection.mutable.HashTable$class.foreachEntry(HashTable.scala:230)
  at scala.collection.mutable.HashMap.foreachEntry(HashMap.scala:40)
  at scala.collection.mutable.HashTable$class.serializeTo(HashTable.scala:125)
  at scala.collection.mutable.HashMap.serializeTo(HashMap.scala:40)
  at scala.collection.mutable.HashMap.writeObject(HashMap.scala:136)
  at sun.reflect.GeneratedMethodAccessor116.invoke(Unknown Source)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:606)
  at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
  at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1495)
  at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
  at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
  at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547)
  at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508)
  at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
  at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
  at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547)
  at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508)
  at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
  at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)

起初,应用程序看起来不错,但在运行一段时间并处理越来越多的设备后,Java堆逐渐被占用,JVM不会释放内存。如何诊断和修复此类问题?

共有3个答案

章晋鹏
2023-03-14

JVM选项不足以配置Spark内存,您还需要设置Spark。驾驶员存储器(用于驾驶员、obv)和火花。执行人。内存(适用于工人)。默认设置为1gb。有关更多信息,请参阅本全面指南。事实上,我劝你读一读,那里有很多东西,熟悉它以后肯定会有回报的。

羊越
2023-03-14

除了驱动程序和执行器内存外,建议尝试以下选项:-

  1. 切换到Kryo序列化-http://spark.apache.org/docs/latest/tuning.html#data-序列化

另外,如果你能发布代码就好了。

钦耀
2023-03-14

您可以始终使用visualVM等探查器工具。监视内存增长。希望您使用的是64位JVM,而不是32位JVM。32位进程只能使用2GB内存,因此内存设置基本上没有用处。希望这有帮助

 类似资料:
  • 问题内容: 有很多问题问这个问题或类似的问题。 它们都给出了必须执行的命令,我不知道该在哪里编写此命令。我想为我的tomcat应用程序永久增加堆空间。 我读了这页 http://javahowto.blogspot.com/2006/06/6-common-errors-in- setting-java-heap.html ,它在Tomcat部分下说 停止Tomcat服务器,设置环境变量CATAL

  • 我正在尝试使用scala执行小计算。Im使用datastax-4.6。我有6个节点,每个16gb RAM和8核。当我尝试执行scala程序时,它会显示以下错误。 错误ActorSystemImpl:线程[sparkDriver-akka.actor.default-dispatcher-17]关闭ActorSystem[sparkDriver]java时出现未捕获的致命错误。lang.OutOfM

  • 我想知道我需要为ExtJS应用程序设置多少JMV最小内存和最大内存(java堆空间)才能在我的正式服JBOSS服务器上运行良好。 是否有一个配置文件是在我构建应用程序后创建的,我可以在其中设置要使用的JVM的最小和最大内存。 我可以测试ExtJS应用程序使用了多少内存吗。 我可以命令服务器使用(即在一些配置文件的帮助下)或为我的ExtJS应用程序分配特定数量的JVM内存吗。 我想知道它,以便我可以

  • 当我使用spark运行一个模型训练管道时,我产生了上面的错误 oom错误由org.apache.spark.util.Collection.ExternalSorter.WritePartitionedFile(ExternalSorter.Scala:706)触发(在堆栈跟踪的底部) 日志: 任何建议都会很棒:)

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

  • 我正在使用Spring Boot实现一个spark应用程序。我构建了一个uber jar,并使用spark-submit来执行应用程序。但我得到了以下例外情况: 18/06/05 15:32:37错误SpringApplication:应用程序运行失败org.SpringFramework.Beans.factory.BeanCreationException:创建类路径资源[org/Spring