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?
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
Vous devez vous connecter pour publier un commentaire.
En dehors de Pilote et Exécuteur testamentaire de la mémoire, suggère d'essayer une des options suivantes: -
Aussi, il serait bon si vous pouvez poster le code.
Je suis d'accord mais l'Objectif de proposer des "MEMORY_AND_DISK_SER_2" était d'abord de vous assurer que votre travail à moins complète. Ceci permettra de vérifier que votre logique est correcte mais pas optimisé, alors on peut l'accorder pour une meilleure performance de sorte qu'il s'exécute entièrement en mémoire.
Je vais essayer l'option MEMORY_AND_DISK_SER_2.
OriginalL'auteur Sumit
Vous pouvez toujours utiliser le profiler des outils comme visualVM. pour surveiller la croissance de la mémoire.
Nous espérons que vous utilisez JVM 64 bits et 32 bits pas de la JVM. Processus 32 bits peut utiliser que l'utilisation de 2 go de mémoire, de sorte que le paramètre de mémoire essentiellement sera d'aucune utilité. Espérons que cela aide
OriginalL'auteur R Sawant
Options JVM ne sont pas suffisantes pour la configuration de l'Étincelle de la mémoire, vous devez également définir
spark.driver.memory
(pour le conducteur, obv.) etspark.executor.memory
(pour les travailleurs). Ceux-ci sont fixés à 1 go par défaut. Voir ce guide approfondie pour plus d'informations. En fait, je vous invite à le lire, il y a un enfer de beaucoup de choses là et de se familiariser avec il va certainement payer plus tard.OriginalL'auteur mehmetminanc