2015-09-17 6 views
21

Possiamo mantenere un RDD in memoria e/o disco quando vogliamo usarlo più di una volta. Tuttavia, dobbiamo disattivarlo da noi stessi in seguito, oppure Spark fa una sorta di garbage collection e smaschera il RDD quando non è più necessario? Ho notato che se io chiamo la funzione di unpersone, ottengo prestazioni più lente.Spark potrebbe sparpagliare lo stesso RDD quando si rende conto che non verrà più utilizzato?

+1

Se si memorizza nella cache un RDD, è necessario annullarlo! – eliasah

+0

@eliasah cosa succede se la memoria è piena? Non scintilla non separare i RDD in modo LRU. – None

+0

No, non è così. Spark non è un sistema di cache. Potresti prendere in considerazione l'utilizzo e la cache esterna, oppure vuoi persistere su disco e su ram. Tuttavia, se non c'è spazio sul disco, si otterrà uno spazio non disponibile sull'errore del dispositivo. – eliasah

risposta

18

Sì, Apache Spark eliminerà l'RDD quando viene raccolto.

In RDD.persist si possono vedere:

sc.cleaner.foreach(_.registerRDDForCleanup(this)) 

Questo mette un WeakReference alla RDD in un ReferenceQueue che porta al ContextCleaner.doCleanupRDD quando il RDD è garbage collection. E c'è:

sc.unpersistRDD(rddId, blocking) 

Per ulteriori contesto vedono ContextCleaner in generale e la commit che ha aggiunto di esso.

Un paio di cose di essere a conoscenza di quando basandosi su garbage collection per RDDs unperisting:

  • Le RDDs utilizzare le risorse sul esecutori, e la raccolta dei rifiuti avviene sul driver. L'RDD non verrà automaticamente disattivato fino a quando non si avrà una pressione di memoria sufficiente sul driver, a prescindere da quanto sia pieno il disco/la memoria degli esecutori.
  • Non è possibile annullare la divisione di parte di un RDD (alcune partizioni/record). Se si costruisce un RDD persistente da un altro, entrambi dovranno adattarsi interamente agli esecutori allo stesso tempo.
+0

Se in realtà stai definendo un WeakReference sull'RDD all'interno del tuo codice, come possiamo dire che Spark lo fa quando si tratta di garbage collection? Per me stiamo chiedendo a Spark di fare per noi quando è necessario. Tuttavia, sto votando la risposta per la sua qualità anche se non sono completamente d'accordo con il 'Sì' – eliasah

+1

Non capisco il tuo commento e credo che tu non capisca neanche il mio post :). _ "all'interno del tuo codice" _ - tutto il codice che ho collegato è all'interno di Spark. Spark fa questo automaticamente. Se si mantiene o si memorizza nella cache un RDD, questo non verrà disattivato quando RDD è GCd. –

+0

Ma cosa succede se lo si mantiene sul disco? Siamo entrambi d'accordo sul fatto che Spark possa farlo. – eliasah

0

Come indicato da @Daniel, Spark rimuoverà le partizioni dalla cache. Ciò accadrà quando non ci sarà più memoria disponibile e verrà effettuato using a least-recently-used algorithm. Non è un sistema intelligente, come sottolineato da @eliasah.

Se non si memorizzano nella cache troppi oggetti, non è necessario preoccuparsene. Se metti in cache troppi oggetti, i tempi di raccolta della JVM diventeranno eccessivi, quindi in questo caso è consigliabile annullarli.

Problemi correlati