簡體   English   中英

Spark應用程序 - Java.lang.OutOfMemoryError:Java堆空間

[英]Spark applicaition - Java.lang.OutOfMemoryError: Java heap space

我使用的是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堆空間”的錯誤。

我嘗試了從0.7到0.35的memoryFraction,但它沒有幫助。 我也嘗試並行/分區到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不會釋放內存。 如何診斷和解決這樣的問題?

除了Driver和Executor內存之外,建議嘗試以下選項: -

  1. 切換到Kryo序列化 - http://spark.apache.org/docs/latest/tuning.html#data-serialization
  2. 使用MEMORY_AND_DISK_SER_2進行RDD持久化。

此外,如果您可以發布代碼將是好的。

您始終可以使用visualVM等分析器工具。 監控內存增長。 希望您使用的是64位JVM而不是32位JVM。 32位進程只能使用2GB內存,因此內存設置基本上沒用。 希望這可以幫助

JVM選項不足以配置Spark內存,還需要設置spark.driver.memory (對於driver, spark.executor.memory 。)和spark.executor.memory (對於worker)。 這些默認設置為1GB。 有關詳細信息, 請參閱此完整指南 實際上,我懇請你閱讀它,那里有很多東西,熟悉它肯定會在以后得到回報。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM