Spark applicaition - Java.lang.OutOfMemoryError: Java heap space

Je suis en utilisant Étincelle Autonome seule machine, avec 128G de mémoire et 32 cœurs. Les éléments suivants sont les paramètres je pense pertinent à mon problème:

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

J'ai une Étincelle d'application dans lequel il y a une boucle de 1000 appareils. Avec chaque tour de boucle (de l'appareil), il prépare fonction de vecteur et puis appelle k-Moyens de MLLib. À 25 à 30 itération de la boucle (traitement de 25 à 30 appareil), il s'exécute dans l'erreur "Java.lang.OutOfMemoryError: Java heap space".

J'ai essayé memoryFraction de 0,7 à 0,35, mais il n'a pas aidé. J'ai aussi essayé le parallélisme/partitions de 200 à pas de chance. L'option de la JVM est "-Xms25G -Xmx25G -XX:MaxPermSize=512m". Mon taille des données n'est que d'environ 2G.

Ici est la trace de la pile:

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)

Au début, l'application a l'air bien, mais après il fonctionne pendant un certain temps et des processus de plus en plus de dispositifs, Java heap est occupé progressivement et la mémoire n'est pas libérée par la JVM. Comment diagnostiquer et réparer ce genre de problème?

Il est tentant de sérialiser des données, peut-être un très grand sujet de données. Je vous suggère d'augmenter la taille maximale du tas-à-dire 100 GO au lieu de 25 GO.
En essayant de la taille du segment 100G maintenant. Merci pour la suggestion.
Avez-vous essayer de mettre de l'étincelle.rdd.compresser pour vrai?

OriginalL'auteur wdz | 2015-11-27