私たちは皆、Sparkがメモリ内で計算を行うことを知っています。私は以下について興味があります。
HDFSからpySparkシェルで10 RDD
を作成すると、これらの10 RDD
sデータはすべてSpark Workers Memoryに存在しますか?
RDD
を削除しないと、メモリに永久に残りますか?
データセット(ファイル)のサイズが利用可能なサイズを超える場合RAMサイズ、データはどこに保存されますか?
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永続レベルを確認します) 。
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でどのように行われるかについての詳細情報。