Lineage
利用內(nèi)存加快數(shù)據(jù)加載,在眾多的其它的In-Memory類數(shù)據(jù)庫或Cache類系統(tǒng)中也有實(shí)現(xiàn),Spark的主要區(qū)別在于它處理分布式運(yùn)算環(huán)境下的數(shù)據(jù)容錯(cuò)性(節(jié)點(diǎn)實(shí)效/數(shù)據(jù)丟失)問題時(shí)采用的方案痰滋。為了保證RDD中數(shù)據(jù)的健壯性些楣,RDD數(shù)據(jù)集通過所謂的血統(tǒng)關(guān)系(Lineage)記住了它是如何從其它RDD中演變過來的。
相比其它系統(tǒng)的細(xì)顆粒度的內(nèi)存數(shù)據(jù)更新級(jí)別的備份或者LOG機(jī)制浪册,RDD的Lineage記錄的是粗顆粒度的扫腺。特定數(shù)據(jù)轉(zhuǎn)換(Transformation)操作(filter, map, join etc.)行為。當(dāng)這個(gè)RDD的部分分區(qū)數(shù)據(jù)丟失時(shí)村象,它可以通過Lineage獲取足夠的信息來重新運(yùn)算和恢復(fù)丟失的數(shù)據(jù)分區(qū)笆环。這種粗顆粒的數(shù)據(jù)模型,限制了Spark的運(yùn)用場(chǎng)合厚者,但同時(shí)相比細(xì)顆粒度的數(shù)據(jù)模型躁劣,也帶來了性能的提升。
Narrow Dependencies
RDD在Lineage依賴方面分為兩種Narrow Dependencies與Wide Dependencies用來解決數(shù)據(jù)容錯(cuò)的高效性库菲。Narrow Dependencies是指父RDD的每一個(gè)分區(qū)最多被一個(gè)子RDD的分區(qū)所用账忘,表現(xiàn)為一個(gè)父RDD的分區(qū)對(duì)應(yīng)于一個(gè)子RDD的分區(qū)或多個(gè)父RDD的分區(qū)對(duì)應(yīng)于一個(gè)子RDD的分區(qū),也就是說一個(gè)父RDD的一個(gè)分區(qū)不可能對(duì)應(yīng)一個(gè)子RDD的多個(gè)分區(qū)熙宇。
Wide Dependencies
指子RDD的分區(qū)依賴于父RDD的多個(gè)分區(qū)或所有分區(qū)鳖擒,也就是說存在一個(gè)父RDD的一個(gè)分區(qū)對(duì)應(yīng)一個(gè)子RDD的多個(gè)分區(qū)。對(duì)與Wide Dependencies烫止,這種計(jì)算的輸入和輸出在不同的節(jié)點(diǎn)上蒋荚,lineage方法對(duì)與輸入節(jié)點(diǎn)完好,而輸出節(jié)點(diǎn)宕機(jī)時(shí)馆蠕,通過重新計(jì)算期升,這種情況下惊奇,這種方法容錯(cuò)是有效的,否則無效吓妆,因?yàn)闊o法重試赊时,需要向上其祖先追溯看是否可以重試(這就是lineage,血統(tǒng)的意思)行拢,Narrow Dependencies對(duì)于數(shù)據(jù)的重算開銷要遠(yuǎn)小于Wide Dependencies的數(shù)據(jù)重算開銷祖秒。
容錯(cuò)
在RDD計(jì)算,通過checkpoint進(jìn)行容錯(cuò)舟奠,做checkpoint有兩種方式竭缝,一個(gè)是checkpoint data,一個(gè)是logging the updates沼瘫。用戶可以控制采用哪種方式來實(shí)現(xiàn)容錯(cuò)抬纸,默認(rèn)是logging the updates方式,通過記錄跟蹤所有生成RDD的轉(zhuǎn)換(transformations)也就是記錄每個(gè)RDD的lineage(血統(tǒng))來重新計(jì)算生成丟失的分區(qū)數(shù)據(jù)耿戚。
Lineage過長(zhǎng)湿故,對(duì)rdd做doCheckpoint()
?SparkContext.setCheckPointDir() //設(shè)置數(shù)據(jù)存路徑