RDD工作機制例項詳解
RDD工作機制
RDD指的是一個只讀的,可分割槽的分散式資料集,這個資料集的全部或部分可以快取在記憶體中,在多次計算間重用,是Spark進行大資料處理計算的核心,在設計演算法的時候,就是在設計RDD的操作,那麼下面通過WordCount例項來詳細介紹RDD的工作機制。關於RDD的特性和理論請參考“Spark 入門文件”。
1、在介紹RDD工作原理之前再回顧一下WordCount的例子:
第一步:建立saprk的配置物件SparkConf
val conf = new SparkConf()
conf.setAppName("My First Spark App!").setMaster("local")
第二步:建立SparkContext物件
val sc = new SparkContext(conf)
第三步:根據具體資料來源(HDFS,Hbase等)通過SparkContext來建立RDD
val lines = sc.textFile(“hdfs://{檔案路徑}/ helloSpark.txt”)
第四步:將每行字元拆分為單個單詞
val words = lines.flatMap { line =>line.split(" ") }
第五步:在單詞拆分的基礎上對每個單詞例項計數為1
val pairs = lines.map{word => (word, 1)}
第六步:在每個單詞例項為1的基礎之上統計每個單詞出現的總次數
val wordcount = pairs.reduceByKey(_+_)
第七步:輸出統計結果
wordcount.foreach(wordNumberPair=> println(wordNumberPair._1 + ":" + wordNumberPair._2))
sc.stop()
2、根據上述的程式圖解spark RDD中資料流動過程
補充說明:第一張圖主要描述的是RDD的transformation,第二張圖描述的是action。在第一張圖中hadoopRDD的方塊內的資料1,資料2,資料3表示把檔案系統中helloSpark.txt檔案的內容分到了三個工作節點上去。(helloSpark.txt檔案內容有四行每行分別是:helloSpark ;hello scala;hello Hadoop ; hello flink。)在第一張圖中所有的map操作都是在各自自己的節點上進行的計算,當執行reduceBykey操作是進行了shuffle通訊,收集各個節點上的資料然後進行單詞統計。最後一個RDD是為儲存結果而準備的。在shuffleRDD中只有兩個節點這個是由分割槽策略決定的,具體需要深入學習。