2016-05-17 11 views
2

私はスパーク・ジョブを提出しています(スパーク・サブミット)。キャッシュrddを自動的に起動しますか?

問題

私はHDFSからアブロファイルを読み込むことによってRDDをロードしています。
次に、rdd &をフィルタリングします(job-1)。
次に、別の基準を使用して再度フィルタリングし、それを数えます(job-2)。

  • ログには、FileInputFormatが最初に60個のファイルを読み込んでいることがわかります。しかし、2度目のファイルは読み込まれません。
  • また、私が行うときrdd.toDebugString私は親rddがキャッシュされて表示されません。ここで

詳細

コードです:

JavaRdd<Record> records = loadAllRecords(); 
JavaRDD<Record> type1Recs = records.filter(selectType1()); 
JavaRDD<Record> type2Recs = records.filter(selectType2()); 
log.info(type1Recs.count()); 
log.info(type2Recs.count()); 

私は最初のカウントのためのRDDのデバッグ情報を見てみると:私は見てみると

..... 
    ..... 
    | MapPartitionsRDD[2] at filter at xxxx.java:61 [] 
    | NewHadoopRDD[0] at newAPIHadoopRDD at xxxxx.java:64 [] 

2番目のカウントのrddデバッグ情報:

..... 
    ..... 
    | MapPartitionsRDD[5] at filter at EventRepo.java:61 [] 
    | NewHadoopRDD[0] at newAPIHadoopRDD at xxxxx.java:64 [] 

私はNewHadoopRDDは、デバッグ文字列で、それに関連するいくつか引くの情報を持っているでしょうキャッチされた場合は...

しかし、私は両方のインスタンスにRDDが​​と呼ばれていることを実現します。 [0]とは何ですか?このコンテキストでは、そのIDは何ですか? RDDにはハンドルがあると思いますので、同じハンドルを再利用することの意義はわかりません。

私が最初countを行うと、私がログに表示さ:

FileInputFormat: Total input paths to process : 60 

しかし、私は2番目のカウントのために同様のログが表示されません。 records Rddをもう一度読み込んではいけませんか?

最後に第二のカウントは、データがメモリ内にあると信じて私をリードしている最初のものより高速である...この行のために

答えて

3

FileInputFormat: Total input paths to process : 60、それはRDDのメタデータに属します。これはNewHadoopRDD.getPartitionsに出力されます。それは怠け者だが、一度しか動かない。 RDDのメタデータがキャッシュされていると言うことができます。しかし、このRDDのデータ(ファイル内のデータ)はキャッシュされません。

+0

ああ興味深い!実際にはもう一度データを読み込んでいますか? – hba

+0

あなたはRDD.cacheを手動で呼び出さない限りうまくいきません。 – zsxwing

2

キャッシュrddは自動的に発生しますか?

時には、はい。 RDDはシャッフルの際に自動的にキャッシュされます。

たとえば、spark Web UIで「スキップされたステージ」が発生した可能性があります。

参照:https://spark.apache.org/docs/1.5.0/programming-guide.html#shuffle-operations

他のケースでは、あなたがrdd.cacheまたはそのバリアントを呼び出す必要があります。

+0

私はこれらの「スキップされたステージ」を見始めています。完全な外部結合を行う前に起こっています...実際は自動的にキャッシングを行っています...しかし、私はあなたが持っていたドキュメントあなたの答えにリンクされて... – hba

関連する問題