web-dev-qa-db-ja.com

Spark RDD-パーティションは常にRAMにありますか?

私たちは皆、Sparkがメモリ内で計算を行うことを知っています。私は以下について興味があります。

  1. HDFSからpySparkシェルで10 RDDを作成すると、これらの10 RDDsデータはすべてSpark Workers Memoryに存在しますか?

  2. RDDを削除しないと、メモリに永久に残りますか?

  3. データセット(ファイル)のサイズが利用可能なサイズを超える場合RAMサイズ、データはどこに保存されますか?

15
Dipankar

HDFSからpySparkシェルに10個のRDDを作成すると、これらの10個のRDDデータはすべてSparkメモリに存在しますか?

はい、10個すべてのRDDデータがsparkワーカーマシンRAMに分散しますが、すべてのマシンに必要なわけではありません。各RDDのパーティションオフコースRDDは、遅延評価中にアクションが実行された場合にのみ、メモリにデータを保持します。

RDDを削除しないと、RDDは永久にメモリに残りますか?

Spark RDDまたはDataframeが使用されなくなった場合、それらを自動的に非永続化します。 RDDまたはデータフレームがキャッシュされているかどうかを確認するには、Spark UI-> Storageテーブルにアクセスして、メモリの詳細を表示します。df.unpersist()またはsqlContext.uncacheTable("sparktable")は、メモリからdfまたはテーブルを削除します 続きを読むためのリンク

データセットのサイズが利用可能なサイズを超えた場合RAMサイズ、データはどこに保存されますか?

RDDがメモリに収まらない場合、一部のパーティションはキャッシュされず、必要に応じてその都度オンザフライで再計算されます。 続きを読むためのリンク

RDDがすでにRAMにある、つまりメモリにあると言っている場合、persist()の必要性は何ですか? -コメントどおり

あなたの質問に答えるために、RDDでトリガーされたアクションがあり、そのアクションがメモリを見つけられなかった場合、キャッシュされていない/持続されていないRDDを削除できます。

一般的に、私たちは永続的なRDDを実行しますが、これには多くの計算またはシャッフリングが必要です(デフォルトではsparkは、回避するためにシャッフルされたRDDを永続化しますコストのかかるネットワークI/O)。これにより、永続的なRDDでアクションが実行された場合、系統グラフに従って最初から再度計算するのではなく、単にそのアクションのみを実行します ここでRDD永続レベルを確認します)

21
mrsrinivas

Pyspark Shellで10個のRDDを作成した場合、これらの10個のRDDデータはすべてSpark Memoryに存在しますか?

回答:RDDには「系統グラフ」(適用された変換)のみが含まれています。したがって、RDDはデータではありません!!! RDDでアクションを実行すると、すべての変換がアクションの前に適用されます。したがって、明示的にキャッシュされていない場合(もちろん、暗黙的にキャッシュするいくつかの最適化があります)、アクションが実行されるたびに、変換全体とアクションが再度実行されます!!!

例-HDFSからRDDを作成する場合、いくつかの変換を適用し、変換されたRDDに対して2つのアクションを実行します。HDFSの読み取りと変換が2回実行されます!!!

したがって、再計算を避けたい場合は、RDDを永続化する必要があります。永続化するには、HEAP、オフヒープ、ディスクの1つ以上の組み合わせを選択できます。

RDDを削除しない場合、それは永久にメモリに存在しますか?

回答:RDDは単なる「系統グラフ」であると考えると、ホスティング言語と同じスコープとライフタイムルールに従います。しかし、計算結果をすでに永続化している場合は、永続化できません!!!

データセットのサイズが使用可能なサイズを超えている場合RAM=サイズ、データはどこに保存されますか?

回答:RDDを実際にメモリに永続化/キャッシュしたと仮定すると、RDDはメモリに格納されます。また、LRUはデータの排除に使用されます。 参照 メモリ管理がSparkでどのように行われるかについての詳細情報。

9
rakesh