web-dev-qa-db-ja.com

Spark RDDはワーカーノードまたはドライバーノード(またはその両方)にキャッシュされていますか?

Sparkによる永続化に関する私の理解を訂正してください。

RDDでcache()を実行した場合、その値は、実際にRDDが最初に計算されたノードでのみキャッシュされます。つまり、100ノードのクラスターがあり、RDDは最初と2番目のノードのパーティションで計算されます。このRDDをキャッシュした場合、Sparkは最初または2番目のワーカーノードでのみその値をキャッシュします。したがって、このSparkアプリケーションがこれを使用しようとするとRDDは後の段階で、Sparkドライバーは最初/ 2番目のノードから値を取得する必要があります。

私は正しいですか?

(または)

RDD値がノードではなくドライバーのメモリに保持されるのですか?

19
Ramesh

これを変える:

次にSparkは、最初のまたは2番目のワーカーノードでのみその値をキャッシュします。

これに:

次にSparkは、最初のおよび2番目のワーカーノードでのみその値をキャッシュします。

そして...はい正解です!

Sparkはメモリ使用量を最小限に抑えようとします(そのため、私たちはそれを気に入っています)。すべてのステートメントを評価するので、不必要なメモリロードは発生しませんlazily、つまり、変換に対して実際の作業を行わず、アクションが発生するのを待ちます。実際の作業(ファイルの読み取り、データのネットワークへの伝達、計算の実行、結果の収集など)を行うよりも、Sparkを選択する余地はありません。

実際にできる限り(つまり、メモリ容量でそれが可能であることを除けば)すべてをキャッシュしたくはありません(そうです、エグゼキュータまたはドライバ、あるいはその両方でより多くのメモリを要求できますが、場合によっては、クラスタだけがbig data)を処理するときに本当に一般的なリソースがなく、それは本当に理にかなっています。つまり、キャッシュされたRDDが何度も使用される(つまり、それをキャッシュする)ジョブの実行を高速化します)。

そのため、RDDが不要になったときに、RDDをunpersist()したいのです...! :)

この画像を確認してください。自分のジョブの1つで、100のエグゼキューターをリクエストしましたが、エグゼキュータータブには101、つまり100のスレーブ/ワーカーと1つのマスター/ドライバーが表示されています。

enter image description here

9
gsamaras

これがキャッシングに関する優れた答えです

(なぜ)キャッシュを呼び出すか、RDDで永続化する必要があるか

基本的にキャッシュは、RDDをそのノードの(永続性レベルセットに基づいて)メモリ/ディスクに格納するため、このRDDが再度呼び出されたときに、その系統(系統-実行される以前の変換のセットを再計算する必要はありません)現在の状態)。

0
Krishna Kalyan
# no actual caching at the end of this statement
rdd1=sc.read('myfile.json').rdd.map(lambda row: myfunc(row)).cache()

# again, no actual caching yet, because Spark is lazy, and won't evaluate anything unless
# a reduction op
rdd2=rdd2.map(mysecondfunc)

# caching is done on this reduce operation. Result of rdd1 will be cached in the memory of each worker node
n=rdd1.count()

だからあなたの質問に答えるために

RDDでcache()を実行した場合、その値は、実際にRDDが最初に計算されたノードでのみキャッシュされます

何かをキャッシュする唯一の可能性は、ワーカーノードではなく、ドライバーノードです

cache関数はRDDrefer )にのみ適用できます。RDDはワーカーノードのメモリにのみ存在するため(レジリエントDistributedDatasets!)、その結果はそれぞれのワーカーノードのメモリにキャッシュされます。結果をドライバーに戻すcountのような操作を適用すると、それは実際にはRDDではなくなります。これは、それぞれのメモリ内のワーカーノードによってRDDが実行された計算の結果にすぎません。

上記の例のcacheは、まだ複数のワーカーノードにあるrdd2で呼び出されたため、キャッシュはワーカーノードのメモリでのみ発生します。

上記の例では、rdd1で再度map-red opを実行すると、キャッシュされているため、JSONを再度読み取ることはありません。

参考までに、キャッシュレベルがMEMORY_ONLYに設定されているという想定に基づいて、Word memoryを使用しています。もちろん、そのレベルが他のレベルに変更された場合、Sparkは設定に基づいてmemoryまたはstorageにキャッシュします

0

RDD.cacheは遅延操作です。 countのようなアクションを呼び出さない限り、何もしません。アクションを呼び出すと、操作はキャッシュを使用します。キャッシュからデータを取得して操作を行うだけです。

RDD.cache-デフォルトのストレージレベルでRDDを永続化します(メモリのみ)。 Spark RDD API

2. RDD値がノードではなくドライバーのメモリに保持されるのですか?

RDDは、ディスクとメモリにも永続化できます。 Sparkすべてのオプションのドキュメント Spark Rdd Persist へのリンクをクリックします

0
Indrajit Swain