2016-03-24 12 views
4

RDDを受け取ってその上で計算を行う汎用関数を構築しています。入力RDDで複数の計算を実行するので、私はそれをキャッシュしたいと思います。たとえば:rが、それは私にも与えられているか、既にキャッシュされない場合がありますので、Sparkで同じRDDを2回キャッシュするとどうなるのですか?

public JavaRDD<String> foo(JavaRDD<String> r) { 
    r.cache(); 
    JavaRDD t1 = r... //Some calculations 
    JavaRDD t2 = r... //Other calculations 
    return t1.union(t2); 
} 

私の質問は、です。それがキャッシュされていて、キャッシュにもう一度キャッシュを呼び出すと、t1t2が計算されますが、キャッシュにはという2つのインスタンスがあります。または発火すると、rがキャッシュされ、無視されるという事実を認識していますか?

答えて

9

なし。キャッシュされたRDDでcacheに電話をかけると何も起こりません。RDDはキャッシュされます(1度だけ)。キャッシングは、多くの他の変換のような、怠惰です:

  • あなたはcache、RDDのstorageLevelMEMORY_ONLY
  • 再度cacheを呼び出すと、それは同じ値に設定されています(変更なし)に設定されているを呼び出すと
  • 評価の際、基礎となるRDDが実現されると、SparkはRDDのstorageLevelをチェックし、キャッシュが必要な場合はキャッシュします。

あなたは安全です。

+0

メモについては、それは私が思っていたものです今のところこれについての記録は見当たらない。あなたの答えが正しく、呼び出しキャッシュがRDDオブジェクトのフラグを変更するだけの場合、なぜ同じオブジェクトを使用できないのですか? –

+0

私はちょっとしたメモに私の質問を説明します。 RDDが 'orig'と呼ばれ、誰かが' r = orig.cache(); 'を実行した場合、関数呼び出しで' cached = r.cache(); 'が呼び出されます。あなたが言っていることが真実なら、私は同じデータをキャッシュに2回、 'r'と' cached'の両方で保存してしまいます。 –

+1

あなたは正しいです - 私は間違っています。 'cache'が返す値を使う必要はなく、' this'を返します - 正確なRDDと同じです。 –

1

ちょうど私のクラスタでテストすると、Zoharは正しいですが、何も起こらず、RDDを一度キャッシュします。その理由は、すべてのRDDが内部でidを持っているからです。スパークは、idを使用してRDDがキャッシュされているかどうかをマークします。 1つのRDDを複数回キャッシュすることは何もしません。

怒鳴るが、私のコードとスクリーンショットです:更新

enter image description here enter image description here

[必要に応じてコードを追加します]


### cache and count, then will show the storage info on WEB UI 

raw_file = sc.wholeTextFiles('hdfs://10.21.208.21:8020/user/mercury/names', minPartitions=40)\ 
       .setName("raw_file")\ 
       .cache() 
raw_file.count() 

### try to cache and count again, then take a look at the WEB UI, nothing changes 

raw_file.cache() 
raw_file.count() 

### try to change rdd's name and cache and count again, to see will it cache a new rdd as the new name again, still 
### nothing changes, so I think maybe it is using the RDD id as a mark, for more we need to take a detailed read on 
### the document even then source code 

raw_file.setName("raw_file_2") 
raw_file.cache().count() 
+1

スクリーンショットの代わりにコードを追加してください! – eliasah

+0

ありがとう、知っていますか?@TzachZoharがcache()に関して言っていることが真である場合。もしそうなら、 'raw_file = raw_file.cache()'を書く必要はありませんか? –

+3

@RoeeGavirelキャッシュはRDDの単なる方法です。何も返されません。ここにドキュメントがあります:http://spark.apache.org/docs/latest/api/python/pyspark.html#pyspark.RDD.cache –

関連する問題