2016-05-17 85 views
2

我正在提交一個spark工作(spark-submit)。是否會自動啓動緩存rdds?

問題

我加載由HDFS讀取的Avro文件的RDD。
然後我過濾rdd &數它(作業1)。
然後我再次使用不同的標準對其進行過濾並計算它(作業2)。

  • 在日誌中,我看到FileInputFormat第一次讀取60個文件。但它不會在第二次讀取任何文件。
  • 另外,當我做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 [] 

當我看第二個計數的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 

但我沒有看到一個類似的日誌第二計數。 records Rdd不應該重新加載嗎?

最後第二計數大於這使我相信數據是內存中的第一快...

回答

3

對於此行,FileInputFormat: Total input paths to process : 60,它屬於RDD的元數據。這個輸出在NewHadoopRDD.getPartitions。這很懶,但只運行一次。你可以說RDD的元數據被緩存了。但是這個RDD的數據(文件中的數據)沒有被緩存。

+0

啊有趣!所以實際上它重新讀取數據呢? – hba

+0

是的,除非你手動調用RDD.cache。 – zsxwing

2

是否會自動啓用緩存rdds?

有時候,是的。在洗牌的情況下,RDD會自動緩存。例如,您可能在火花Web UI中觀察到「跳過的階段」。

請參見:https://spark.apache.org/docs/1.5.0/programming-guide.html#shuffle-operations

在其他情況下,你將需要調用rdd.cache或其變體。

+0

我開始看到這些「跳過的階段」,它們在我進行完全外連接之前就已經發生了...所以實際上它會自動執行緩存......但是我沒有在您擁有的文檔中看到這一點鏈接在你的答案... – hba