Spark容錯機制

2021-07-23 19:22:08 字數 2345 閱讀 9758

一般來說,分布式資料集的容錯性有兩種方式:資料檢查點和記錄資料的更新

面向大規模資料分析,資料檢查點操作成本很高,需要通過資料中心的網路連線在機器之間複製龐大的資料集,而網路頻寬往往比記憶體頻寬低得多,同時還需要消耗更多的儲存資源。

因此,spark選擇記錄更新的方式。但是,如果更新粒度太細太多,那麼記錄更新成本也不低。因此,rdd只支援粗粒度轉換,即只記錄單個塊上執行的單個操作,然後將建立rdd的一系列變換序列(每個rdd都包含了他是如何由其他rdd變換過來的以及如何重建某一塊資料的資訊。因此rdd的容錯機制又稱「血統(lineage)」容錯)記錄下來,以便恢復丟失的分割槽。

lineage本質上很類似於資料庫中的重做日誌(redo log),只不過這個重做日誌粒度很大,是對全域性資料做同樣的重做進而恢復資料。

相比其他系統的細顆粒度的記憶體資料更新級別的備份或者log機制,rdd的lineage記錄的是粗顆粒度的特定資料transformation操作(如filter、map、join等)行為。當這個rdd的部分分割槽資料丟失時,它可以通過lineage獲取足夠的資訊來重新運算和恢復丟失的資料分割槽。因為這種粗顆粒的資料模型,限制了spark的運用場合,所以spark並不適用於所有高效能要求的場景,但同時相比細顆粒度的資料模型,也帶來了效能的提公升。

rdd在lineage依賴方面分為兩種:窄依賴(narrow dependencies)與寬依賴(wide dependencies,原始碼中稱為shuffle

dependencies),用來解決資料容錯的高效性。

本質理解:根據父rdd分割槽是對應1個還是多個子rdd分割槽來區分窄依賴(父分割槽對應乙個子分割槽)和寬依賴(父分割槽對應多個子分

區)。如果對應多個,則當容錯重算分割槽時,因為父分割槽資料只有一部分是需要重運算元分割槽的,其餘資料重算就造成了冗餘計算。

對於寬依賴,stage計算的輸入和輸出在不同的節點上,對於輸入節點完好,而輸出節點宕機的情況,通過重新計算恢復資料這種情況下,這種方法容錯是有效的,否則無效,因為無法重試,需要向上追溯其祖先看是否可以重試(這就是lineage,血統的意思),窄依賴對於資料的重算開銷要遠小於寬依賴的資料重算開銷。

窄依賴和寬依賴的概念主要用在兩個地方:乙個是容錯中相當於redo日誌的功能;另乙個是在排程中構建dag作為不同stage的劃分點。

第一,窄依賴可以在某個計算節點上直接通過計算父rdd的某塊資料計算得到子rdd對應的某塊資料;寬依賴則要等到父rdd所有資料都計算完成之後,並且父rdd的計算結果進行hash並傳到對應節點上之後才能計算子rdd。

第二,資料丟失時,對於窄依賴只需要重新計算丟失的那一塊資料來恢復;對於寬依賴則要將祖先rdd中的所有資料塊全部重新計算來恢復。所以在長「血統」鏈特別是有寬依賴的時候,需要在適當的時機設定資料檢查點。也是這兩個特性要求對於不同依賴關係要採取不同的任務排程機制和容錯恢復機制。

在容錯機制中,如果乙個節點宕機了,而且運算窄依賴,則只要把丟失的父rdd分割槽重算即可,不依賴於其他節點。而寬依賴需要父rdd的所有分割槽都存在,重算就很昂貴了。可以這樣理解開銷的經濟與否:在窄依賴中,在子rdd的分割槽丟失、重算父rdd分割槽時,父rdd相應分割槽的所有資料都是子rdd分割槽的資料,並不存在冗餘計算。在寬依賴情況下,丟失乙個子rdd分割槽重算的每個父rdd的每個分割槽的所有資料並不是都給丟失的子rdd分割槽用的,會有一部分資料相當於對應的是未丟失的子rdd分割槽中需要的資料,這樣就會產生冗餘計算開銷,這也是寬依賴開銷更大的原因。因此如果使用checkpoint運算元來做檢查點,不僅要考慮lineage是否足夠長,也要考慮是否有寬依賴,對寬依賴加checkpoint是最物有所值的。

通過上述分析可以看出在以下兩種情況下,rdd需要加檢查點。

dag中的lineage過長,如果重算,則開銷太大(如在pagerank中)。

在寬依賴上做checkpoint獲得的收益更大。

由於rdd是唯讀的,所以spark的rdd計算中一致性不是主要關心的內容,記憶體相對容易管理,這也是設計者很有遠見的地方,這樣減少了框架的複雜性,提公升了效能和可擴充套件性,為以後上層框架的豐富奠定了強有力的基礎。

在rdd計算中,通過檢查點機制進行容錯,傳統做檢查點有兩種方式:通過冗餘資料和日誌記錄更新操作。在rdd中的docheckpoint方法相當於通過冗餘資料來快取資料,而之前介紹的血統就是通過相當粗粒度的記錄更新操作來實現容錯的。

檢查點(本質是通過將rdd寫入disk做檢查點)是為了通過lineage做容錯的輔助,lineage過長會造成容錯成本過高,這樣就不如在中間階段做檢查點容錯,如果之後有節點出現問題而丟失分割槽,從做檢查點的rdd開始重做lineage,就會減少開銷。

gitcafe部落格主頁(

github部落格主頁(

csdn部落格(

Spark容錯機制

一般來說,分布式資料集的容錯性有兩種方式 資料檢查點和記錄資料的更新。面向大規模資料分析,資料檢查點操作成本很高,需要通過資料中心的網路連線在機器之間複製龐大的資料集,而網路頻寬往往比記憶體頻寬低得多,同時還需要消耗更多的儲存資源。因此,spark選擇記錄更新的方式。但是,如果更新粒度太細太多,那麼...

spark中的容錯

一般來說,分布式資料集的容錯性有兩種方式 資料檢查點和記錄資料的更新。面向大規模資料分析,資料檢查點操作成本很高,需要通過資料中心的網路連線在機器之間複製龐大的資料集,而網路頻寬往往比記憶體頻寬低得多,同時還需要消耗更多的儲存資源。因此,spark選擇記錄更新的方式。但是,如果更新粒度太 細太多,那...

Spark Spark容錯機制

一般來說,分布式資料集的容錯性有兩種方式 資料檢查點和記錄資料的更新。面向大規模資料分析,資料檢查點操作成本很高,需要通過資料中心的網路連線在機器之間複製龐大的資料集,而網路頻寬往往比記憶體頻寬低得多,同時還需要消耗更多的儲存資源。因此,spark選擇記錄更新的方式。但是,如果更新粒度太細太多,那麼...