1. 程式人生 > >Spark入門——1:RDD及程式設計介面

Spark入門——1:RDD及程式設計介面

     RDD是Spark的核心,也是整個Spark的架構基礎。spark與mapreduce相比,前者提供了更加豐富的程式設計介面給程式猿們。所以下面主要說明RDD的基本概念,以及其重要介面。

RDD包含4大操作:

               1,建立操作:RDD的建立有兩個途徑。一個是來之外部儲存系統(例如:HDFS,S3)或者內部集合,另外一個是來自其他RDD的轉換操作(例如map,join,filter,等)。

              1)從集合中生成:parallelize(),makeRDD()

              2)通過儲存建立:textFile(),  hadoopFile(),sequenceFile(),objectFile(),hadoopRDD(),

                                          newAPIHadoopFile()

               2,轉換操作:map,distinct,flatMap,repartition,coalesce,union,intersection,                                         subtract

                     如果RDD中有很多空任務或者小任務,可以呼叫coalesce或者repartition來減少                           partition數量。repartition只是coalesce介面中shuffle為true的簡單實現,repartition                         呼叫coalesce

                     關於coalesce合併函式設定shuffle引數的問題(M個分割槽重新化為N個分割槽):

                     若M<N,如果有資料分佈不均的情況,用HashPartitioner函式將資料重新分成M個分                  區,需將shuffle設為true

                    若M>N,且相差不多(M=1000,N=100),可將M個分割槽中部分分割槽合併為一個,最終                合成 N個分割槽,可將shuffle設為false,這樣父子RDD之間為窄依賴

                    若M>N,且相差懸殊(M=1000,N=1),這時父子RDD本身就是窄依賴,同在一個                      stage中存在並行程度不夠的問題,可將shuffle設為true,提高並行化程度

                    在並行度和shuffle資料寫磁碟之間做平衡

               union操作可能包含重複資料,intersection不會有重複資料

                若map操作過程中需要頻繁建立額外物件,可以用mappartition使同一個分割槽共享同一個              物件,以提高效能

                Zip操作預設兩個RDD的partition數和元素數都相等,否則異常;zipPartition需要RDD具               有相同分割槽數即可

               3,控制操作:cache(),persist(),checkpoint()

               checkpoint與persist的不同在於:checkpoint操作會將RDD持久化在HDFS中,後者在memory中;其次checkpoint會切斷之前所有的依賴關係

               4,行動操作:

                    集合標量行動:count,reduce,first,collect,tak*e,top,takeOrdered,aggregate

                   儲存行動:[email protected]%*&#

         RDD的一個操作會被用在所有該RDD的資料上(即所謂的粗粒度操作),這使得只要記下RDD的轉換操作就能構建它的繼承關係(lineage)。

 RDD分割槽:

 建立RDD時,如果不指定分割槽,系統會預設分割槽數,預設值是該程式被分配資源的CPU數目。

       RDD優先位置(preferlocation):

  RDD按照“移動計算”理念,spark排程時儘可能將任務分配到資料塊儲存的位置。preferlocation返回的是資料塊儲存的位置。

       RDD的依賴關係:

       窄依賴(OneToOneDependency):每個父RDD最多隻被子RDD的一個分割槽所使用(map,filter)

       寬依賴(ShuffelDependency):多個子RDD依賴同一個父RDD(沒經過partition的RDD進行join)

       依賴的影響:寬依賴需要取得所有父RDD所有分割槽資料進行計算,做類似MR裡面的shuffle操作,窄依賴可以在叢集的一個節點上流水線般執行;窄依賴對節點故障恢復起來更快,並行化計算效果更好。

     RDD分割槽函式(partitioner)

    HashPartitioner和RangePartitioner。partitioner只存在於(K,V)型別的RDD中。