java - Spark 应用程序 - Java.lang.OutOfMemoryError : Java heap space

标签 java apache-spark jvm out-of-memory heap-memory

我用的是Spark Standalone单机,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堆空间”的错误。

我尝试将 memoryFraction 从 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释放。如何诊断和解决此类问题?

最佳答案

您始终可以使用分析器工具,例如 visualVM .监控内存增长。 希望您使用的是 64 位 JVM 而不是 32 位 JVM。 32 位进程只能使用 2GB 内存,所以内存设置基本上没有用。希望这有帮助

关于java - Spark 应用程序 - Java.lang.OutOfMemoryError : Java heap space,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33964053/

相关文章:

java - 用于操纵帆船的控制算法或函数

java - Angular 2 - 按 ID 的 HTTP 删除方法不起作用

azure - 何时适合在 Spark 批处理作业中截断 RDD 图的谱系

apache-spark - azure HDInsight 上具有 azure blob 存储的增量表

java - Canvas 和图形上下文 - 如何更改画笔的形状

json - Apache Spark : Convert column with a JSON String to new Dataframe in Scala spark

java - 为什么 Java 字节码方法中使用的局部变量数量不是最经济的?

java - 可以用 Go 编写 Intellij 插件吗?

java - Oracle Java 7 JVM 的默认最大堆大小是如何计算的?

java/三角函数/数学。 3 空间中立方体的相对轴,处理库(bug?)