分析&回答
Checkpoint介紹
Checkpoint容錯(cuò)機(jī)制是Flink可靠性的基石,可以保證Flink集群在某個(gè)算子因?yàn)槟承┰?如 異常退出)出現(xiàn)故障時(shí),能夠?qū)⒄麄€(gè)應(yīng)用流圖的狀態(tài)恢復(fù)到故障之前的某一狀態(tài),保證應(yīng)用流圖狀態(tài)的一致性。Flink的Checkpoint機(jī)制原理來自“Chandy-Lamport algorithm”算法。
Barriers
flink 分布式快照的核心元素是 stream barriers,這些barriers被注入到流中,并作為流的一部分,隨著流流動(dòng)。barriers將數(shù)據(jù)流的記錄分為進(jìn)入當(dāng)前快照的記錄和進(jìn)入下一個(gè)快照的記錄,每個(gè)barriers都攜帶了快照的ID,快照的數(shù)據(jù)在barriers的前面推送。barriers非常輕量級(jí),不會(huì)中斷流的流動(dòng)。同一時(shí)間,會(huì)有多個(gè)checkpoint在并發(fā)進(jìn)行。
barrier被注入到并行流的數(shù)據(jù)源,注入快照n (稱為Sn)的barriers 是數(shù)據(jù)源中個(gè)一個(gè)位置,在kafka 就是某個(gè)分區(qū)的最后一條記錄的offset。這個(gè)位置Sn后續(xù)會(huì)匯報(bào)給JM的checkpoint coordinator(協(xié)調(diào)checkpoint功能)。 barrier隨著流向下游流動(dòng),當(dāng)中間的operator從他所有的輸入流中收到checkpoint n 的barrier時(shí),該operator會(huì)將barrier發(fā)送給他的下游operator。一旦到達(dá)DAG的末端,sink會(huì)將這條流的state handle匯報(bào)JM的checkpoint coordinator,當(dāng)sink從他所有的輸入流中接收到了checkpoint n barrier ,Jm 會(huì)返回一個(gè)completed checkpoint meta, 然后checkpoint 標(biāo)記為完成,狀態(tài)存儲(chǔ)到相應(yīng)的state backend中。
barrier 對(duì)齊
當(dāng)一個(gè)opeator有多個(gè)輸入流的時(shí)候,checkpoint barrier n 會(huì)進(jìn)行對(duì)齊,就是已到達(dá)的會(huì)先緩存到buffer里等待其他未到達(dá)的,一旦所有流都到達(dá),則會(huì)向下游廣播,exactly-once 就是利用這一特性實(shí)現(xiàn)的,at least once 因?yàn)椴粫?huì)進(jìn)行對(duì)齊,就會(huì)導(dǎo)致有的數(shù)據(jù)被重復(fù)處理。
checkpoint 數(shù)據(jù)結(jié)構(gòu)
當(dāng)一個(gè)operator接收到所有上游發(fā)送的 checkpoint n barrier 向下游發(fā)送之前,會(huì)對(duì)狀態(tài)進(jìn)行一次快照,將offset state 等值保存起來,默認(rèn)情況下是保存在Jm的內(nèi)存中,由于可能會(huì)比較大,可以存在狀態(tài)后端中,生成中建議放hdfs.
到最終checkpoint 快照的完整數(shù)據(jù)結(jié)構(gòu)類似與一個(gè)表格,每個(gè)opeator經(jīng)過處理后填寫屬于自己的那部分,最后會(huì)將其存到state backend中供failover時(shí)使用。
反思&擴(kuò)展
Flink 的容錯(cuò)機(jī)制(checkpoint) 內(nèi)部實(shí)現(xiàn)
每個(gè)需要Checkpoint的應(yīng)用在啟動(dòng)時(shí),Flink的JobManager為其創(chuàng)建一個(gè) CheckpointCoordinator(檢查點(diǎn)協(xié)調(diào)器),CheckpointCoordinator全權(quán)負(fù)責(zé)本應(yīng)用的快照制作。
CheckpointCoordinator(檢查點(diǎn)協(xié)調(diào)器),CheckpointCoordinator全權(quán)負(fù)責(zé)本應(yīng)用的快照制作。
CheckpointCoordinator(檢查點(diǎn)協(xié)調(diào)器) 周期性的向該流應(yīng)用的所有source算子發(fā)送 barrier(屏障)。
當(dāng)某個(gè)source算子收到一個(gè)barrier時(shí),便暫停數(shù)據(jù)處理過程,然后將自己的當(dāng)前狀態(tài)制作成快照,并保存到指定的持久化存儲(chǔ)中,最后向CheckpointCoordinator報(bào)告自己快照制作情況,同時(shí)向自身所有下游算子廣播該barrier,恢復(fù)數(shù)據(jù)處理
下游算子收到barrier之后,會(huì)暫停自己的數(shù)據(jù)處理過程,然后將自身的相關(guān)狀態(tài)制作成快照,并保存到指定的持久化存儲(chǔ)中,最后向CheckpointCoordinator報(bào)告自身快照情況,同時(shí)向自身所有下游算子廣播該barrier,恢復(fù)數(shù)據(jù)處理。
每個(gè)算子按照步驟3不斷制作快照并向下游廣播,直到最后barrier傳遞到sink算子,快照制作完成。
當(dāng)CheckpointCoordinator收到所有算子的報(bào)告之后,認(rèn)為該周期的快照制作成功; 否則,如果在規(guī)定的時(shí)間內(nèi)沒有收到所有算子的報(bào)告,則認(rèn)為本周期快照制作失敗。
RocksDB實(shí)現(xiàn)增量checkpoint原理:
state backend中提供了一種RocksDb存儲(chǔ)checkpoint ,它是Flink提供的唯一可以實(shí)現(xiàn)增量checkpoint的方法。原理是每次生成checkpoint是會(huì)生成sst文件(不會(huì)再修改了),會(huì)和之前的文件進(jìn)行對(duì)比,每次上傳新增的sst文件即可,大概就是這樣。文章來源:http://www.zghlxwxcb.cn/news/detail-689311.html
喵嗚面試助手:一站式解決面試問題,你可以搜索微信小程序 [喵嗚面試助手]?或關(guān)注 [喵嗚刷題] -> 面試助手?免費(fèi)刷題。如有好的面試知識(shí)或技巧期待您的共享!文章來源地址http://www.zghlxwxcb.cn/news/detail-689311.html
到了這里,關(guān)于Flink的checkpoint是怎么實(shí)現(xiàn)的?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!