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?
risposta
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.
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
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. –
Ma cosa succede se lo si mantiene sul disco? Siamo entrambi d'accordo sul fatto che Spark possa farlo. – eliasah
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.
Se si memorizza nella cache un RDD, è necessario annullarlo! – eliasah
@eliasah cosa succede se la memoria è piena? Non scintilla non separare i RDD in modo LRU. – None
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