2016-06-24 6 views
0

スコープがデータフレームとスパークでどのように機能するかは興味があります。下の例では、私はファイルのリストを持っています、それぞれ独立してデータフレームにロードされ、いくつかの操作が実行され、次に、ディスクにdfOutputと書きます。スパーク - スコープ、データフレーム、およびメモリ管理

​​
  1. ループが実行されたときに捨てfor loop内の各データフレームである、またはそれらをメモリ内に滞在していますか?
  2. 破棄されない場合は、この時点でどのような方法でメモリ管理を行うのがよいでしょうか?

答えて

1

DataFrameオブジェクトは小さいです。ただし、Sparkエグゼキュータのキャッシュ内のデータを参照でき、Sparkエグゼキュータのシャッフルファイルを参照できます。 DataFrameがガーベッジ・コレクションされると、キャッシュとシャッフル・ファイルがエグゼキュータで削除されます。

コードには、ループを過ぎたDataFramesへの参照はありません。彼らは適格ガベージコレクションです。ガベージコレクションは、通常、メモリの負荷に応じて発生します。ディスクをいっぱいにするシャッフルファイルが心配な場合は、明示的なGCをトリガーして、もはや参照されていないDataFramesのシャッフルファイルが削除されていることを確認することができます。

DataFrame([stuff happens])の処理内容によっては、データがメモリに保存されないことがあります。これはSparkのデフォルト動作モードです。データを読み込み、変換して書き出したいだけなら、それはすべて行単位で行われ、決してメモリに格納されません。 (キャッシングは、明示的に要求したときにのみ発生します)。

これらのことをすべて考慮すると、問題が発生するまでメモリ管理について心配する必要はありません。

+0

ありがとう、非常に有益な答え! –

+0

dfでの線形変換のプロセスを考えると、df1 = df0.bla(); df2 = df1.blabla(); df3 = df2.blablabla()、df1はいつガベージされますか?スコープが終了したとき、またはプログラムがそれを認識したときには、それ以上回線を使用しません(基本的にdf2が作成されると、df1はそれ以上コールされません)。 –

+1

子孫のRDD( 'df2'のようなもの)は親(' df1'のもの)を参照しています。だから、 'df1'は範囲外になったときにのみ収集され、その子孫のすべてはガベージコレクションされます。これは、RDDが遅延しているためです。 「df1」の命令(例えば、「このファイルを読む」)は、アクション(例えば、「ラインをカウントする」)が実行された場合にのみ直ちに実行されることはない。そのため、リファレンスは先祖のRDDに保持されなければなりません。 –