web-dev-qa-db-ja.com

Sparkは、RDDがもう使用されないことに気付いたときに、それ自体を非永続化しますか?

RDDを複数回使用する場合は、RDDをメモリやディスクに永続化できます。ただし、後で自分で永続化を解除する必要がありますか、それともSparkはガベージコレクションを実行し、不要になったRDDを永続化しませんか?unpersist関数を自分で呼び出すと、 、パフォーマンスが低下します。

29
MetallicPriest

はい、Apache Sparkは、ガベージコレクションの際にRDDを永続化しません。

RDD.persist 見ることができます:

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

これにより、参照キューのRDDにWeakReferenceが配置され、 ContextCleaner.doCleanupRDD RDDがガベージコレクションされる場合。そしてそこに:

sc.unpersistRDD(rddId, blocking)

詳細については、一般的なContextCleanerおよびそれを追加した commit を参照してください。

非永続RDDのガベージコレクションに依存する場合に注意する必要があるいくつかの事項:

  • RDDはエグゼキューターのリソースを使用し、ガベージコレクションはドライバーで行われます。エグゼキュータのディスク/メモリがどの程度いっぱいになっても、ドライバに十分なメモリ圧力がかかるまで、RDDは自動的に永続化されません。
  • RDDの一部(一部のパーティション/レコード)を永続化解除することはできません。ある永続RDDを別のRDDから構築する場合、両方を同時に完全にエグゼキューターに合わせる必要があります。
22
Daniel Darabos

@Danielで指摘されているように、Sparkはキャッシュからパーティションを削除します。これは、使用可能なメモリがなくなると発生し、実行されます 最近使用されたアルゴリズム 。@eliasahが指摘したように、これはスマートなシステムではありません。

キャッシュするオブジェクトが多すぎない場合は、心配する必要はありません。キャッシュするオブジェクトが多すぎると、JVMの収集時間が過剰になるため、この場合はオブジェクトを永続化しないことをお勧めします。

0
Jorge