文章目錄
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的運用場合,但同時相比細顆粒度的數據模型,也帶來了性能的提高。分佈式
依賴關係決定Lineage的複雜程度,同時也是的RDD具備了容錯性。由於當某一個分區裏的數據丟失了,Spark程序會根據依賴關係進行局部計算來恢復丟失的數據。依賴的關係主要分爲2種,分別是 寬依賴(Wide Dependencies)和窄依賴(Narrow Dependencies)。ide
寬依賴:是指子RDD的分區依賴於父RDD的多個分區或全部分區,也就是說存在一個父RDD的一個分區對應一個子RDD的多個分區。函數
窄依賴:是指父RDD的每個分區最多被一個子RDD的分區所用,表現爲一個父RDD的分區對應於一個子RDD的分區或多個父RDD的分區對應於一個子RDD的分區,也就是說一個父RDD的一個分區不可能對應一個子RDD的多個分區。性能
判斷依賴的本質:判斷是寬依賴仍是窄依賴的本質其實是根據父RDD的分區和對應的子RDD的分區來進行區分寬依賴和窄依賴的。當父RDD的分區對應多個分區時,也就是說父RDD的分區對應的另外一部分數據多是其餘子RDD的數據,那麼當該RDD數據丟失後,進行容錯從分區就會把該RDD跟另一個RDD的數據都從新計算一遍,這樣就會致使冗餘計算(由於,另外一個子RDD的數據是當前丟失的子RDD所不須要的也計算了一遍)。spa
對於 Shuffle Dependencies(通常是寬依賴),Stage 計算的輸入和輸出在不一樣的節點上,輸入節點的Lineage無缺,而輸出節點死機的狀況,經過從新計算恢復數據這種狀況下,這種方法容錯是有效的,不然無效,由於沒法重試,須要向上追溯其祖先看是否能夠重試(這就是 lineage,血統的意思),窄依賴對於數據的重算開銷要遠小於 寬依賴的數據重算開 銷。.net
窄依賴( Narrow Dependency) 和 Shuffle Dependency 的概念主要用在兩個地方:一個是容錯中至關於 Redo 日誌的功能;另外一個是在調度中構建 DAG 做爲不一樣 Stage 的劃分點。3d
寬依賴和窄依賴如圖所示日誌
在Spark的容錯機制中,當一個節點宕機了,進行容錯恢復時,對於窄依賴來說,進行重計算時只要把丟失的父RDD分區重算便可,不依賴於其餘節點。而對於Shuffle Dependency來講,進行重計算時須要父RDD的分區都存在,這樣計算量就太大了比較耗費性能。orm
以下圖所示,若是 RDD_1 中的 Partition3 出錯丟失,圖1.1 Spark 會回溯到 Partition3 的父分區 RDD_0 的 Partition3,圖1.2則會回溯到父分區RDD_0的Partition0和Partition3,對 RDD_0 的 Partition3 重算算子,獲得 RDD_1 的 Partition3。其餘分區丟失也是同理重算進行容錯恢復。
若是 RDD_1 中的 Partition3 丟失出錯,因爲其父分區是 RDD_0 的全部分區,因此須要回溯到 RDD_0,重算 RDD_0 的全部分區,而後將 RDD_1 的 Partition3 須要的數據彙集合併爲 RDD_1 的 Partition3。在這個過程當中,因爲 RDD_0 中不是 RDD_1 中 Partition3 須要的數據也所有進行了重算,因此產生了大量冗餘數據重算的開銷。
同時在RDD計算,也經過checkpoint進行容錯,作checkpoint有兩種方式,一個是checkpoint data,一個是logging the updates。用戶能夠控制採用哪一種方式來實現容錯,默認是logging the updates方式,經過記錄跟蹤全部生成RDD的轉換(transformations)也就是記錄每一個RDD的lineage(血統)來從新計算生成丟失的分區數據。可是,在使用checkpoint算子來作檢查點,不只須要考慮Lineage長度,還也要考慮Lineage的複雜度(是否有寬依賴),對於Shuffle Dependency加Checkpoint是一個值得提倡的作法。
參考: https://blog.csdn.net/u013063153/article/details/73865123