2015-11-27 23 views
5

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?

+0

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. –

+0

Provare ad accumulare dimensioni di heap 100G ora. Grazie per il suggerimento. – wdz

+0

Hai provato a impostare spark.rdd.compress su true? –

risposta

1

È sempre possibile utilizzare strumenti di profilatura come visualVM. per monitorare la crescita della memoria. Si spera che si utilizzi JVM a 64 bit e non JVM a 32 bit. Il processo a 32 bit può utilizzare solo la memoria da 2 GB, quindi l'impostazione della memoria sarà essenzialmente inutile. Spero che questo aiuti

+0

Grazie per aver consigliato visualVM. Lo sto provando ora per monitorare l'utilizzo della memoria. A proposito, sto usando JVM a 64 bit. – wdz

0

Le opzioni JVM non sono sufficienti per la configurazione della memoria Spark, è inoltre necessario impostare spark.driver.memory (per driver, ob.) E spark.executor.memory (per lavoratori). Quelli sono impostati su 1 GB per impostazione predefinita. See this thorough guide per ulteriori informazioni. In realtà, ti esorto a leggerlo, ci sono un sacco di cose lì e farcelo sapere ti pagheranno sicuramente più tardi.

+0

Nella mia impostazione, ho "spark.driver.memory 16G" e "spark.executor.memory 96G". In realtà ho esaminato il documento di configurazione di Spark ma non sono riuscito a risolvere il mio problema con OOM. Sto provando visualVM ora per vedere cosa succede in heap. – wdz

2

Oltre conducente e della memoria esecutore, suggerisce di provare seguenti opzioni: -

  1. Passa a Kryo serializzazione - http://spark.apache.org/docs/latest/tuning.html#data-serialization
  2. Usa MEMORY_AND_DISK_SER_2 per RDD persistenza.

Inoltre, sarebbe utile se è possibile inserire il codice.

+0

Grazie per il tuo suggerimento! Ho già usato la serializzazione di Kryo. Poiché MEMORY_AND_DISK_SER_2 è notevolmente più lento di MEMORY_ONLY, sono riluttante a utilizzarlo a meno che non abbia altra scelta. – wdz

+0

Sono d'accordo ma l'obiettivo di suggerire "MEMORY_AND_DISK_SER_2" è stato innanzitutto quello di garantire che il tuo lavoro almeno completi. Ciò verificherà che la tua logica sia corretta anche se non ottimizzata, quindi possiamo ottimizzarla per ottenere prestazioni migliori in modo che vengano eseguite completamente in memoria. – Sumit

+0

Proverò l'opzione MEMORY_AND_DISK_SER_2. – wdz