2014年12月3日 星期三

[Apache Spark][基本架構] RDD特性(三)- RDD之間的依賴關係(Dependency)


        延續[Spark][基本架構] RDD特性(二)- 轉換(Transformations)和行動(Actions)提到的,RDD在進入行動之前,都是在不同的RDD之間做轉換,RDD會記錄下這些轉換過程,自己這個RDD是從哪個RDD(又稱為parentRDD)轉換過來的,這層父與子的關係就稱為Dependency(依賴關係).本篇文章會進一步說明依賴關係的類別.
        依賴關係很簡單只有兩種類別:狹依賴(Narrow Dependency),和廣依賴(Wide Dependency).看圖就很容易明白:
RDD雖然會轉換,但是Dependency看的是資料本身所在的位置會不會移動(Base on data locality)
  • Narrow Dependeny:表示站在ParentRDD的角度來看,每個RDD只會對應到另外一個RDD,資料仍然會在原地,例如:
    • Map 每筆資料都是一對一的對應到Map函數,所以出來的RDD也是同一地點的資料
    • Filter 只是根據條件對原本的RDD做篩選,基本上資料還是在原地.
    • Union 把在同一個地方的兩個RDD合併,資料不需要搬移
    • Join with inputs co-partitioned 如果兩筆資料是已經依照合併的key值排序過,那在join的過程也不需要搬移檔案
  • Wide Dependency:指一個RDD可能會分散給不同的RDD.資料會需要在不同的地點做搬移.例如:
    • GroupByKey:資料要重新按照Key值重新排,所以會造成大量的資料移動.所以才說[Spark][開發] 避免使用GroupByKey
    • Join沒排序的資料,當然就得重新打散重組

        介紹到這邊,我們稍微跟前面的介紹互相串聯一下.上一篇文章[Spark][基本架構] RDD特性(二)- 轉換(Transformations)和行動(Actions)說明Spark Lazy運行的特性,而在更早之前的一篇[Spark][基本架構] RDD特性(一)說明了RDD除了會記錄dependecy之外,也會記錄偏好執行的位置,結合這篇提到的narrow和wide的特性,我們可以得到RDD運行時的整體樣貌:
  1. 使用者會透過不同的方式操作RDD
  2. 如果這些操作只是屬於轉換(transformation)類型,那RDD只是記錄下來父子之間的依賴關係
  3. 只有當使用者選擇行動(action)後,Spark才會將整個行動的流程納入排程(Scheduler)
  4. Saprk會將narrow類型的RDD(因為原地即可進行轉換)盡可能的放在同一個階段處理(如下圖)
  5. Stage的分野就是wide RDD或是Action,這讓RDD的處理更有效率: