2015-11-13 14 views
5

Ho eseguito un flusso di lavoro su 3 milioni di record x 15 colonne tutte le stringhe sulla mia macchina da 4 GB con 4 core utilizzando pyspark 1.5 in modalità locale. Ho notato che se eseguo di nuovo lo stesso flusso di lavoro senza prima riavviare la scintilla, la memoria si esaurisce e ottengo Eccezioni di memoria insufficiente.Chiamare manualmente la garbage collection di spark da pyspark

Poiché tutte le mie cache sommano fino a circa 1 GB, ho pensato che il problema si trova nella raccolta dei rifiuti. Sono stato in grado di eseguire manualmente il garbage collector python chiamando:

import gc 
collected = gc.collect() 
print "Garbage collector: collected %d objects." % collected 

Questo ha aiutato un po '.

Ho suonato con le impostazioni del GC della scintilla in base a questo article e ho provato a comprimere l'RDD ea cambiare il serializzatore in Kyro. Ciò aveva rallentato l'elaborazione e non ha aiutato molto la memoria.

Dato che so esattamente quando ho cicli di CPU inutilizzati per chiamare il GC, potrebbe aiutare la mia situazione a sapere come chiamarla manualmente nella JVM.

risposta

0

Non è necessario chiamare manualmente il GC. Se hai avuto OOMException è perché non c'è più memoria disponibile. Si dovrebbe cercare perdita di memoria, riferimenti aka si mantiene nel codice. Se si rilasciano questi riferimenti, la JVM creerà spazio libero quando necessario.

+0

Sì, l'ho letto molte volte ma continuo a pensare che il mio caso sia idoneo per il GC manuale per diversi motivi: a. È stato utile chiamare il GC Python poiché considera il numero di oggetti inutili piuttosto che le loro dimensioni, b. La natura della mia applicazione coinvolge fasi in cui nessun calcolo ha luogo in attesa di una decisione dell'utente, e c. Cosa succede se ho bisogno di eseguire alcune funzionalità python ad alta memoria o un'applicazione completamente diversa? Dubito che la JVM gc avrebbe tenuto conto di quello – architectonic

+0

Se si deve eseguire la funzionalità ad uso intensivo della memoria su jvm (se non si conosce per Python), il vm utilizzerà tutta la memoria tutta da usare e se è necessario altro incidente (perché il jvm rispetta il tuo desiderio;). Chiama il gc quando non c'è calcolo può essere visto come una buona idea, ma questo gc sarà un gc completo e il gc completo è lento molto lento. In ogni caso se si verificano eccezioni di memoria insufficiente non è un problema di GC! È un problema di codice! O c'è bisogno di più memoria o perdita di memoria. – crak