2017-08-07 87 views
0

我在閱讀有關spark的內容,並且遇到以下聲明。解釋RDD重新計算

最後,Spark的RDD在默認情況下會在您每次運行 操作時重新計算。如果你想重用RDD在多個動作, 你可以問星火使用RDD.persist()堅持它

我想詳細地瞭解,什麼寓意重新計算。例如我寫下面的代碼片段。我想也許如果我在代碼睡眠時在文本文件中添加n條記錄(通過終端),當計算行動再次計算時,我將能夠看到新的總計數。但是,即使我添加了3條記錄,它也只佔1個額外的記錄。 你能幫我理解以上關於重新計算的問題嗎?如果可能的話,爲什麼我的實驗不起作用?

這裏是輸出樣子(我已刪除不必要的行):5

啓動睡眠

11 45 225 /用戶/用戶/數據/的wordCount:回波之前

計數。 TXT

睡眠後

計數後回波:6

package sparkPractice; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 

import org.apache.spark.SparkConf; 
import org.apache.spark.api.java.JavaRDD; 
import org.apache.spark.api.java.JavaSparkContext; 

public class WordCount { 

    public static void main(String[] args) throws IOException, InterruptedException { 

     SparkConf conf=new SparkConf().setMaster("local[4]").setAppName("Line Count"); 

     JavaSparkContext ctx=new JavaSparkContext(conf); 
     JavaRDD<String> textLoadRDD = ctx.textFile("/Users/user/data/wordCount.txt"); 
     System.out.println("Count before echo: "+textLoadRDD.count()); 
     System.out.println("Starting sleep"); 
     Thread.sleep(20000); 
     Runtime rt = Runtime.getRuntime(); 
     Process process = rt.exec("wc /Users/user/data/wordCount.txt"); 
     process.waitFor(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); 
     String line=reader.readLine(); 
     while (line != null) {  
      System.out.println(line); 
      line = reader.readLine(); 
     } 
     System.out.println("After sleep"); 
     System.out.println("Count after echo: "+textLoadRDD.count()); 
     ctx.close(); 

    } 

} 
+0

你確定伯爵是一樣的嗎?我已經嘗試了Spark-Shell,並在2次調用「textLoadRDD.count()」之間更改我的文件給出了不同的結果 – Fabich

+0

嗨@Lordofdark我已經更新了system.out.println的計數結果的問題。 – user500377

回答

0

我修改了上述步驟,現在用新的一組記錄代替本地文件,而不是添加記錄(如上所述),它工作,即它給出了新計數而不是舊計數,其描述了每次調用時重新計算RDD。

由於我在本地機器上執行程序,添加記錄時可能會出現一些問題,因此如果我無法在覆蓋超前主題的情況下找出問題,就會更新此問題。然而,現在假設得到證實。

0

最後,Spark的RDD在默認情況下會在您每次對它們執行操作時重新計算。如果你想重用多個動作的RDD,你可以問它的Spark使用RDD.persist()

我認爲,從this blog這幅畫解釋它都有很好的堅持:

enter image description here

如果你沒有緩存/持久化任何東西,那麼每當你需要一個輸出時(當你調用諸如「count」之類的動作),數據就從磁盤讀取並且操作完成。您可以在讀取後進行緩存(例如),然後每個其他操作都會跳過讀取並從緩存的數據開始。

將緩存視爲操作中的檢查點:當需要輸出時,每次操作都會再次調用,直到最後一次緩存的RDD(或數據集)。