RDDdependency原始碼詳解

2021-12-30 10:54:05 字數 2547 閱讀 9869

一、rdd的依賴關係

rdd的依賴關係分為兩類:寬依賴和窄依賴。我們可以這樣認為:

(1)窄依賴:每個parent rdd 的 partition 最多被 child rdd 的乙個partition 使用。

(2)寬依賴:每個parent rdd partition 被多個 child rdd 的partition 使用。

窄依賴每個 child rdd 的 partition 的生成操作都是可以並行的,而寬依賴則需要所有的 parent rdd partition shuffle 結果得到後再進行。

二、org.apache.spark.dependency.scala 原始碼解析

dependency是乙個抽象類:

// denpendency.scala

abstract class dependency[t] extends serializable 它有兩個子類:narrowdependency 和 shuffledenpendency,分別對應窄依賴和寬依賴。

(1)narrowdependency也是乙個抽象類,定義了抽象方法getparents,輸入partitionid,用於獲得child rdd 的某個partition依賴的parent rdd的所有 partitions。

// denpendency.scala

abstract class narrowdependency[t](_rdd: rdd[t]) extends dependency[t] 窄依賴又有兩個具體的實現:onetoonedependency和rangedependency。

(a)onetoonedependency指child rdd的partition只依賴於parent rdd 的乙個partition,產生onetoonedependency的運算元有map,filter,flatmap等。可以看到getparents實現很簡單,就是傳進去乙個partitionid,再把partitionid放在list裡面傳出去。

// denpendency.scala

class onetoonedependency[t](rdd: rdd[t]) extends narrowdependency[t](rdd) (b)rangedependency指child rdd partition在一定的範圍內一對一的依賴於parent rdd partition,主要用於union。

// denpendency.scala

class rangedependency[t](rdd: rdd[t], instart: int, outstart: int, length: int)

extends narrowdependency[t](rdd) else

}}(2)shuffledependency指寬依賴,表示乙個parent rdd的partition會被child rdd的partition使用多次。需要經過shuffle才能形成。

// denpendency.scala

class shuffledependency[k: classtag, v: classtag, c: classtag](

@transient private val _rdd: rdd[_ <: product2 v val partitioner: partitioner serializer: serializer="sparkenv.get.serializer," keyordering: option none aggregator: c mapsidecombine: boolean="false)" extends dependency override def rdd: rdd _rdd.asinstanceof private keyclassname: string="reflect.classtag[k].runtimeclass.getname" valueclassname: combinerclassname: shuffleid: int="_rdd.context.newshuffleid()" shufflehandle: shufflehandle="_rdd.context.env.shufflemanager.registershuffle(" shuffleid _rdd.partitions.length this _rdd.sparkcontext.cleaner.foreach>

由於shuffle涉及到網路傳輸,所以要有序列化serializer,為了減少網路傳輸,可以map段聚合,通過mapsidecombine和aggregator控制,還有key排序相關的keyordering,以及重輸出的資料如何分割槽的partitioner,還有一些class資訊。partition之間的關係在shuffle出戛然而止,因此shuffle是劃分stage的依據。

三、兩種依賴的區分

首先,窄依賴允許在乙個集群節點上以流水線的方式(pipeline)計算所有父分割槽。例如,逐個元素地執行map、然後filter操作;而寬依賴則需要首先計算好所有父分割槽資料,然後在節點之間進行shuffle,這與mapreduce類似。第二,窄依賴能夠更有效地進行失效節點的恢復,即只需重新計算丟失rdd分割槽的父分割槽,而且不同節點之間可以平行計算;而對於乙個寬依賴關係的lineage圖,單個節點失效可能導致這個rdd的所有祖先丟失部分分割槽,因而需要整體重新計算。

AbstractCollection原始碼分析

abstractcollection抽象類提供了collection的骨架實現,collection分析請看 這裡直接看它的 是如何實現的.public abstract iterator iterator 該方法沒有實現.public abstract int size 該方法沒有實現.publi...

ThreadPoolExecutor原始碼閱讀

執行緒池解決兩個問題 一是復用執行緒,減少建立銷毀執行緒帶來系統開銷 二是限定系統資源使用邊界,避免大量執行緒消耗盡系統記憶體 適用於互不依賴,執行時間短,不需要對執行緒控制操作的執行緒 新增任務時,1.若執行緒數量小於corepoolsize,則新增執行緒執行任務 2.若執行緒數量大於等於core...

OrangePi One Android 原始碼編譯

一 系統環境搭建參照 二 lichee原始碼編譯 1.檢視help build.sh h2.配置核心 cd linux 3.4 make arch arm menuconfig 進入配置頁面,上下移動列表,空格是選擇列表,左右移動選擇退出選項 3.首次編譯執行清除 在 lichee linux3.4...