私はスパーク・ジョブを提出しています(スパーク・サブミット)。キャッシュ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をもう一度読み込んではいけませんか?
最後に第二のカウントは、データがメモリ内にあると信じて私をリードしている最初のものより高速である...この行のために
ああ興味深い!実際にはもう一度データを読み込んでいますか? – hba
あなたはRDD.cacheを手動で呼び出さない限りうまくいきません。 – zsxwing