RDDを複数回使用する場合、RDDをメモリおよび/またはディスクに保存することができます。しかし、私たちは後でそれを理解しなくてはいけませんか、あるいはSparkは何らかのガベージコレクションを行い、不要になったときにRDDをunpersistしますか?私は、自分自身がアンパッショニスト機能を自分自身と呼んでいると、パフォーマンスが遅くなることに気付きます。Sparkは、RDD自体がそれ以上使用されないことを認識すると、それを理解しませんか?
答えて
はい、Apache Sparkはガベージコレクションの際にRDDをアンパサリします。
RDD.persist
、あなたは見ることができます:
sc.cleaner.foreach(_.registerRDDForCleanup(this))
これは、RDDがガベージコレクトされたときにContextCleaner.doCleanupRDD
につながるReferenceQueueにRDDに弱い参照を置きます。そして、そこに:より多くのコンテキストについては
sc.unpersistRDD(rddId, blocking)
は、一般的にContextCleanerを参照し、これを追加しましたcommit。
RDDSをunperistingため、ガベージコレクションに依存する際に注意すべきいくつかの事柄:
- RDDSが執行上のリソースを使用して、ガベージコレクションがドライバで発生します。 RDDは、エグゼキュータのディスク/メモリがどれくらいいっぱいになっても、ドライバに十分なメモリ圧迫があるまで、自動的に固定されません。
- RDD(一部のパーティション/レコード)の一部をアンパサシすることはできません。 1つの永続化RDDを別のRDDから構築する場合、両方ともエグゼキュータに完全に収まる必要があります。
実際にコード内のRDDにWeakReferenceを定義している場合、SparkがガベージコレクションのときにSparkがどのようにしていると言いますか?私にとっては、Sparkに必要なときに私たちのために行うように求めています。それにもかかわらず、私は「はい」と完全に同意しなくても、それは品質だと回答しています。 – eliasah
私はあなたのコメントを理解していません。 _ "あなたのコードの中で" _ - 私がリンクしているすべてのコードはSparkの中にあります。スパークはこれを自動的に行います。 RDDを永続化またはキャッシュすると、RDDがGCdのときは固定されません。 –
しかし、それをディスクに保存するとどうなりますか?私たちはどちらも、スパークがそれを行うことができることに同意します。 – eliasah
@Danielによって指摘されているように、Sparkはキャッシュからパーティションを削除します。利用可能なメモリがなくなったら、これが起こります。using a least-recently-used algorithmが実行されます。 @eliasahによって指摘されているように、それはスマートなシステムではありません。
あまりにも多くのオブジェクトをキャッシュしていない場合、気にする必要はありません。あまりにも多くのオブジェクトをキャッシュすると、JVMの収集時間が過度になるため、この場合はそれらをunpersistすることをお勧めします。
RDDをキャッシュする場合は、自分自身を固定解除する必要があります。 – eliasah
@eliasahメモリがいっぱいの場合はどうなりますか? RDDをLRU方式でアンパサシすることはありません。 – None
いいえ、それはありません。スパークはキャッシュシステムではありません。あなたは、外部キャッシュの使用を検討したり、ディスクやラムに保存したりすることもできます。それにもかかわらず、ディスク上にスペースがない場合は、デバイスエラー時に空き容量がありません。 – eliasah