Spark Lineage(血統)
- Lineage利用內存加快數據加載,在其它的In-Memory類數據庫或Cache類系統中也有實現。
Spark的主要區別在於它採用血統(Lineage)來時實現分佈式運算環境下的數據容錯性(節點失效、數據丟失)問題
。RDD Lineage被稱爲RDD運算圖
或RDD依賴關係圖
,是RDD所有父RDD的圖。它是在RDD上執行transformations
函數並創建邏輯執行計劃(logical execution plan)的結果,是RDD的邏輯執行計劃。相比其它系統的細顆粒度的內存數據更新級別的備份或者LOG機制,RDD的Lineage記錄的是粗顆粒度的特定數據轉換(Transformation)操作(filter, map, join etc.)行爲。當這個RDD的部分分區數據丟失時,它可以通過Lineage找到丟失的父RDD的分區進行局部計算來恢復丟失的數據,這樣可以節省資源提高運行效率。這種粗顆粒的數據模型,限制了Spark的運用場合,但同時相比細顆粒度的數據模型,也帶來了性能的提升。 - RDD只支持粗粒度轉換,即在大量記錄上執行的單個操作。將創建RDD的一系列Lineage(血統)記錄下來,以便恢復丟失的分區。RDD的Lineage會記錄RDD的元數據信息和轉換行爲,當該RDD的部分分區數據丟失時,它可以根據這些信息來重新運算和恢復丟失的數據分區。
注意:RDD和它依賴的父RDD(s)的關係有兩種不同的類型,即窄依賴(narrow dependency)和寬依賴(wide dependency)。
窄依賴
- 窄依賴指的是每一個父RDD的Partition最多被子RDD的一個Partition使用,窄依賴我們形象的比喻爲獨生子女.
寬依賴
- 寬依賴指的是多個子RDD的Partition會依賴同一個父RDD的Partition,會引起shuffle,總結:寬依賴我們形象的比喻爲超生.
DAG
- DAG(Directed Acyclic Graph)叫做
有向無環圖
,原始的RDD通過一系列的轉換就就形成了DAG,根據RDD之間的依賴關係的不同將DAG劃分成不同的Stage,對於窄依賴,partition的轉換處理在Stage中完成計算。對於寬依賴,由於有Shuffle的存在,只能在parent RDD處理完成後,才能開始接下來的計算,因此寬依賴是劃分Stage的依據
。
任務劃分
RDD任務切分中間分爲:Application、Job、Stage和Task
Application
:初始化一個SparkContext即生成一個ApplicationJob
:一個Action算子就會生成一個JobStage
:根據RDD之間的依賴關係的不同將Job劃分成不同的Stage,遇到一個寬依賴則劃分一個Stage。Task
:Stage是一個TaskSet,將Stage劃分的結果發送到不同的Executor執行即爲一個Task。
注意:Application->Job->Stage-> Task每一層都是1對n的關係。
WordCount的運行規劃圖
你知道的越多,你不知道的越多。
有道無術,術尚可求,有術無道,止於術。
如有其它問題,歡迎大家留言,我們一起討論,一起學習,一起進步