質問は次のように定式化されると思います。
キャッシュを呼び出すか、RDDで永続化する必要があるのはいつですか?
Sparkプロセスはレイジーです。つまり、必要になるまで何も起こりません。質問にすばやく答えるために、val textFile = sc.textFile("/user/emp.txt")
発行後、データには何も起こりませんHadoopRDD
。ファイルをソースとして使用して、aのみが構築されます。
そのデータを少し変換するとします。
val wordsRDD = textFile.flatMap(line => line.split("\\W"))
繰り返しますが、データには何も起こりません。これで、必要なときに適用される関数へのwordsRDD
参照testFile
と関数を含む新しいRDD ができました。
系統wordsRDD.count
などのRDDチェーンなどのRDDに対してアクションが呼び出された場合のみ実行されます。つまり、パーティションに分割されたデータは、Sparkクラスターのエグゼキューターによってロードされ、関数が適用され、結果が計算されます。flatMap
この例のような線形の系統でcache()
は必要ありません。データはエグゼキュータにロードされ、すべての変換が適用され、最後count
にすべてがメモリ内で計算されます-データがメモリに収まる場合。
cache
RDDの系統が分岐する場合に役立ちます。前の例の単語をフィルター処理して、肯定的な単語と否定的な単語のカウントにしたいとします。あなたはそのようにすることができます:
val positiveWordsCount = wordsRDD.filter(word => isPositive(word)).count()
val negativeWordsCount = wordsRDD.filter(word => isNegative(word)).count()
ここでは、各ブランチがデータのリロードを発行します。明示的なcache
ステートメントを追加すると、以前に実行された処理が確実に保持され、再利用されます。ジョブは次のようになります。
val textFile = sc.textFile("/user/emp.txt")
val wordsRDD = textFile.flatMap(line => line.split("\\W"))
wordsRDD.cache()
val positiveWordsCount = wordsRDD.filter(word => isPositive(word)).count()
val negativeWordsCount = wordsRDD.filter(word => isNegative(word)).count()
そのため、cache
今後の処理に再利用できるチェックポイントが作成されるため、「系統を壊す」と言われています。
経験則:cache
RDDの系統が分岐する場合、またはRDDがループのように複数回使用される場合に使用します。