一、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...