Utilizzo una singola macchina Spark Standalone, con memoria 128G e 32 core. Le seguenti sono le impostazioni che ritenga utili ai fini mio problema:Applicazione Spark - Java.lang.OutOfMemoryError: Java heap space
spark.storage.memoryFraction 0.35
spark.default.parallelism 50
spark.sql.shuffle.partitions 50
Ho un'applicazione Spark in cui v'è un ciclo per 1000 dispositivi. Con ogni ciclo (dispositivo) prepara il vettore di funzionalità e quindi chiama k-Means di MLLib. Al 25 ° al 30 ° ciclo di loop (elaborazione dal 25 ° al 30 ° dispositivo), viene eseguito l'errore "Java.lang.OutOfMemoryError: Java heap space".
Ho provato memoryFraction da 0,7 a 0,35, ma non è stato di aiuto. Ho anche provato parallelismo/partizioni a 200 senza fortuna. L'opzione JVM è "-Xms25G -Xmx25G -XX: MaxPermSize = 512m". La mia dimensione dei dati è solo di circa 2G.
Ecco traccia dello stack:
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)
All'inizio, l'applicazione sembra bene, ma dopo aver eseguito per un po 'e processi sempre più dispositivi, Java heap è occupato gradualmente e la memoria non viene rilasciato dal JVM. Come diagnosticare e risolvere questo problema?
Sta tentando di serializzare così dati, possibilmente una grande quantità di dati. Suggerisco di aumentare la dimensione massima dell'heap per dire 100 GB anziché 25 GB. –
Provare ad accumulare dimensioni di heap 100G ora. Grazie per il suggerimento. – wdz
Hai provato a impostare spark.rdd.compress su true? –