checkpoint是啥
簡(jiǎn)單點(diǎn)說(shuō)蔚出,就是將正在運(yùn)行的任務(wù)的狀態(tài)保存下來(lái)弟翘。這個(gè)狀態(tài)包括任務(wù)中每個(gè)算子的state,緩存的數(shù)據(jù)(比如processFunction)等骄酗∠∮啵可以保存在hdfs,磁盤(pán)等趋翻。
為什么需要checkpoint
當(dāng)flink的任務(wù)或者機(jī)器掛掉了睛琳,重新啟動(dòng)任務(wù)時(shí)需要將任務(wù)恢復(fù)到原來(lái)的狀態(tài)。當(dāng)然這個(gè)恢復(fù)程度可以由你自己定踏烙,比如excatly-once师骗,at-least-once等。
checkpoint 如何做到excatly-once讨惩?
以下場(chǎng)景選至《Flink基礎(chǔ)教程》
上圖中的場(chǎng)景表示:
數(shù)據(jù)流:<word,time> 辟癌,根據(jù)word分區(qū),統(tǒng)計(jì)word的總次數(shù)荐捻。
當(dāng)flink的數(shù)據(jù)源處理到ckpt時(shí)黍少,他會(huì)將當(dāng)前數(shù)據(jù)源的offset落盤(pán)。
當(dāng)map算子接受到ckpt時(shí)处面,會(huì)將該算子的狀態(tài)(中間結(jié)果)落盤(pán)厂置,此時(shí)的中間結(jié)果為 b 的總數(shù)為5,c 的總數(shù)為1魂角。
次數(shù)處理c的算子實(shí)例掛掉了昵济,任務(wù)需要重新啟動(dòng)∫熬荆恢復(fù)過(guò)程如下
ckpt之前的數(shù)據(jù)不會(huì)被重放砸紊,數(shù)據(jù)源會(huì)從位置1,2囱挑,3重放,也就是說(shuō)ckpt后面三個(gè)元素會(huì)被重放沼溜,此時(shí)算子的中間狀態(tài)(<b,5>,<cm1>)也會(huì)被恢復(fù)平挑。
聰明的同學(xué)可能會(huì)想到,這樣做map算子雖然可能多次接收到同一個(gè)數(shù)據(jù)系草,但是其邏輯是正確的通熄,所以flink內(nèi)部確實(shí)實(shí)現(xiàn)的excatly-once。 但是找都,試想一個(gè)場(chǎng)景唇辨,如果map中每次的中間結(jié)果都會(huì)落盤(pán),那拓?fù)渲貑r(shí)能耻,map會(huì)接收到重復(fù)數(shù)據(jù)赏枚,也就意味著數(shù)據(jù)庫(kù)會(huì)出現(xiàn)相同的操作亡驰。這是不行的,所以說(shuō)光靠flink內(nèi)部的exactly-once是不行滴饿幅。也需要端到端的保證凡辱,那么如何保證flink到存儲(chǔ)介質(zhì)的excatly-once語(yǔ)義呢,大體有兩種方案:
- sink緩存數(shù)據(jù)栗恩,也等到接受到ckpt時(shí)一次性輸出透乾。
- 每次都輸出,提供類(lèi)似事務(wù)回滾的機(jī)制磕秤。
熟悉數(shù)據(jù)庫(kù)事務(wù)的同學(xué)乳乌,應(yīng)該會(huì)聯(lián)想到兩種事務(wù)隔離級(jí)別和上面一一對(duì)應(yīng):
- read-commit
- read-uncommit
本篇沒(méi)有涉及到具體的細(xì)節(jié),以下是我學(xué)習(xí)時(shí)遇到的問(wèn)題:
- 每一個(gè)算子的實(shí)例都會(huì)接受到ckpt市咆,那當(dāng)前算子應(yīng)該是等到所有實(shí)例都接受到了才會(huì)觸發(fā)ckpt汉操。
- 上游算子的ckpt已經(jīng)觸發(fā)了,如果下游還沒(méi)接受到就任務(wù)重啟了床绪,那豈不是這部分?jǐn)?shù)據(jù)下次就不會(huì)重現(xiàn)了客情。(應(yīng)該是等最后一個(gè)算子接收到了ckpt,本次ckpt才算數(shù))