延續[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運行時的整體樣貌:
- 使用者會透過不同的方式操作RDD
- 如果這些操作只是屬於轉換(transformation)類型,那RDD只是記錄下來父子之間的依賴關係
- 只有當使用者選擇行動(action)後,Spark才會將整個行動的流程納入排程(Scheduler)
- Saprk會將narrow類型的RDD(因為原地即可進行轉換)盡可能的放在同一個階段處理(如下圖)
- Stage的分野就是wide RDD或是Action,這讓RDD的處理更有效率:
感謝分享!
回覆刪除天啊 居然被xyz軟體大大留言!
刪除