一般來(lái)說(shuō),分布式數(shù)據(jù)集的容錯(cuò)性有兩種方式:數(shù)據(jù)檢查點(diǎn)(Checkpoint)和記錄數(shù)據(jù)的更新。由于面對(duì)大規(guī)模的數(shù)據(jù)分析,Checkpoint機(jī)制的操作成本會(huì)很高,故而spark選擇通過(guò)記錄數(shù)據(jù)更新的方式來(lái)提高容錯(cuò)率。但是如果更新粒度太細(xì)太多,那么記錄更新成本也不低。因此,RDD只支持粗粒度轉(zhuǎn)換,即只記錄單個(gè)塊上執(zhí)行的單個(gè)操作,然后將創(chuàng)建RDD的一系列變換序列(每個(gè)RDD都包含了他是如何由其他RDD變換過(guò)來(lái)的以及如何重建某一塊數(shù)據(jù)的信息。因此RDD的容錯(cuò)機(jī)制又稱(chēng)“血統(tǒng)(Lineage)”容錯(cuò))記錄下來(lái),以便恢復(fù)丟失的分區(qū)。
Lineage(血統(tǒng))機(jī)制:
與其他系統(tǒng)的內(nèi)存數(shù)據(jù)更新的不同的是,RDD的lineage機(jī)制所記錄的是特定數(shù)據(jù)的tranformation的操作(filter,map,join等)。當(dāng)這個(gè)RDD的部分分區(qū)數(shù)據(jù)丟失時(shí),它可以通過(guò)Lineage獲取足夠的信息來(lái)重新運(yùn)算和恢復(fù)丟失的數(shù)據(jù)分區(qū)。因?yàn)檫@種粗顆粒的數(shù)據(jù)模型,限制了Spark的運(yùn)用場(chǎng)合,所以Spark并不適用于所有高性能要求的場(chǎng)景,但同時(shí)相比細(xì)顆粒度的數(shù)據(jù)模型,也帶來(lái)了性能的提升。
RDD在Lineage依賴(lài)方面分為了兩種:完全依賴(lài)(narrow dependency)和部分依賴(lài)(shuffle dependency)
完全依賴(lài)和部分依賴(lài)的主要區(qū)別在于父RDD所對(duì)應(yīng)的子RDD是多個(gè)(部分依賴(lài))還是一個(gè)(完全依賴(lài)),當(dāng)對(duì)應(yīng)于多個(gè)子RDD的時(shí)候,在容錯(cuò)機(jī)制觸發(fā)時(shí),由于只需計(jì)算父RDD的一部分,會(huì)造成冗余計(jì)算。
對(duì)于部分依賴(lài)來(lái)說(shuō),Stage計(jì)算的輸入和輸出在不同的節(jié)點(diǎn)上,對(duì)于輸入節(jié)點(diǎn)完好,而輸出節(jié)點(diǎn)死機(jī)的情況,通過(guò)重新計(jì)算恢復(fù)數(shù)據(jù)這種情況下,這種方法容錯(cuò)是有效的,否則無(wú)效,因?yàn)闊o(wú)法重試,需要向上追溯其祖先看是否可以重試(這就是lineage,血統(tǒng)的意思),完全依賴(lài)對(duì)于數(shù)據(jù)的重算開(kāi)銷(xiāo)要遠(yuǎn)小于部分依賴(lài)的數(shù)據(jù)重算開(kāi)銷(xiāo)。
在容錯(cuò)機(jī)制中,如果一個(gè)節(jié)點(diǎn)死機(jī)了,而且運(yùn)算完全依賴(lài),則只要把丟失的父RDD分區(qū)重算即可,不依賴(lài)于其他節(jié)點(diǎn)。而部分依賴(lài)需要父RDD的所有分區(qū)都存在,重算就很昂貴了。可以這樣理解開(kāi)銷(xiāo)的經(jīng)濟(jì)與否:在完全依賴(lài)中,在子RDD的分區(qū)丟失、重算父RDD分區(qū)時(shí),父RDD相應(yīng)分區(qū)的所有數(shù)據(jù)都是子RDD分區(qū)的數(shù)據(jù),并不存在冗余計(jì)算。在部分依賴(lài)情況下,丟失一個(gè)子RDD分區(qū)重算的每個(gè)父RDD的每個(gè)分區(qū)的所有數(shù)據(jù)并不是都給丟失的子RDD分區(qū)用的,會(huì)有一部分?jǐn)?shù)據(jù)相當(dāng)于對(duì)應(yīng)的是未丟失的子RDD分區(qū)中需要的數(shù)據(jù),這樣就會(huì)產(chǎn)生冗余計(jì)算開(kāi)銷(xiāo),這也是部分依賴(lài)開(kāi)銷(xiāo)更大的原因。因此如果使用Checkpoint算子來(lái)做檢查點(diǎn),不僅要考慮Lineage是否足夠長(zhǎng),也要考慮是否有部分依賴(lài),對(duì)部分依賴(lài)加Checkpoint是最物有所值的。