2015-09-17 3 views
21

RDDを複数回使用する場合、RDDをメモリおよび/またはディスクに保存することができます。しかし、私たちは後でそれを理解しなくてはいけませんか、あるいはSparkは何らかのガベージコレクションを行い、不要になったときにRDDをunpersistし​​ますか?私は、自分自身がアンパッショニスト機能を自分自身と呼んでいると、パフォーマンスが遅くなることに気付きます。Sparkは、RDD自体がそれ以上使用されないことを認識すると、それを理解しませんか?

+1

RDDをキャッシュする場合は、自分自身を固定解除する必要があります。 – eliasah

+0

@eliasahメモリがいっぱいの場合はどうなりますか? RDDをLRU方式でアンパサシすることはありません。 – None

+0

いいえ、それはありません。スパークはキャッシュシステムではありません。あなたは、外部キャッシュの使用を検討したり、ディスクやラムに保存したりすることもできます。それにもかかわらず、ディスク上にスペースがない場合は、デバイスエラー時に空き容量がありません。 – eliasah

答えて

18

はい、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から構築する場合、両方ともエグゼキュータに完全に収まる必要があります。
+0

実際にコード内のRDDにWeakReferenceを定義している場合、SparkがガベージコレクションのときにSparkがどのようにしていると言いますか?私にとっては、Sparkに必要なときに私たちのために行うように求めています。それにもかかわらず、私は「はい」と完全に同意しなくても、それは品質だと回答しています。 – eliasah

+1

私はあなたのコメントを理解していません。 _ "あなたのコードの中で" _ - 私がリンクしているすべてのコードはSparkの中にあります。スパークはこれを自動的に行います。 RDDを永続化またはキャッシュすると、RDDがGCdのときは固定されません。 –

+0

しかし、それをディスクに保存するとどうなりますか?私たちはどちらも、スパークがそれを行うことができることに同意します。 – eliasah

0

@Danielによって指摘されているように、Sparkはキャッシュからパーティションを削除します。利用可能なメモリがなくなったら、これが起こります。using a least-recently-used algorithmが実行されます。 @eliasahによって指摘されているように、それはスマートなシステムではありません。

あまりにも多くのオブジェクトをキャッシュしていない場合、気にする必要はありません。あまりにも多くのオブジェクトをキャッシュすると、JVMの収集時間が過度になるため、この場合はそれらをunpersistすることをお勧めします。