RDDを複数回使用する場合は、RDDをメモリやディスクに永続化できます。ただし、後で自分で永続化を解除する必要がありますか、それともSparkはガベージコレクションを実行し、不要になったRDDを永続化しませんか?unpersist関数を自分で呼び出すと、 、パフォーマンスが低下します。
はい、Apache Sparkは、ガベージコレクションの際にRDDを永続化しません。
RDD.persist
見ることができます:
sc.cleaner.foreach(_.registerRDDForCleanup(this))
これにより、参照キューのRDDにWeakReferenceが配置され、 ContextCleaner.doCleanupRDD
RDDがガベージコレクションされる場合。そしてそこに:
sc.unpersistRDD(rddId, blocking)
詳細については、一般的なContextCleanerおよびそれを追加した commit を参照してください。
非永続RDDのガベージコレクションに依存する場合に注意する必要があるいくつかの事項:
@Danielで指摘されているように、Sparkはキャッシュからパーティションを削除します。これは、使用可能なメモリがなくなると発生し、実行されます 最近使用されたアルゴリズム 。@eliasahが指摘したように、これはスマートなシステムではありません。
キャッシュするオブジェクトが多すぎない場合は、心配する必要はありません。キャッシュするオブジェクトが多すぎると、JVMの収集時間が過剰になるため、この場合はオブジェクトを永続化しないことをお勧めします。