Flink從BucketSink看checkpoint與故障恢復(fù)

看了 BucketSink 的相關(guān)源碼匙头。著重看了它的checkpoint以及故障恢復(fù)機(jī)制瑟慈。
把大概的理解梳理如下:
BucketSink 大體的工作流程:
1.新建一個(gè)文件桃移,不斷的寫入文件中,后綴命名為 .in-progress
2.判斷文件寫入完畢封豪,關(guān)閉該文件時(shí)谴轮,后綴名命名為 .pending
3.checkpoint觸發(fā)時(shí),將上次ck到這次ck間的所有 .pending 文件變?yōu)?finish 狀態(tài)
BucketSink 實(shí)現(xiàn)了 CheckpointedFunction 接口
有兩個(gè)方法
void snapshotState(FunctionSnapshotContext context) throws Exception;

void initializeState(FunctionInitializationContext context) throws Exception;?其中:
initializeState 方法在每次新建 BucketSink 或者故障恢復(fù)時(shí) 會(huì)調(diào)用吹埠。
snapshotState 在每次觸發(fā) ck 時(shí)會(huì)被調(diào)用第步。
下面簡(jiǎn)單分析下這兩個(gè)方法的邏輯:
initializeState 方法主要執(zhí)行一些初始化操作,其中我認(rèn)為關(guān)鍵的在于

1.png

restoredBucketStates = stateStore.getSerializableListState("bucket-states");
該方法獲取一個(gè)叫做 bucket-states 的狀態(tài)對(duì)象缘琅,從名稱也可知粘都,該對(duì)象用于重啟。正常情況下刷袍,該對(duì)象無內(nèi)容下面的for語句不會(huì)執(zhí)行翩隧。但是若有故障重啟的情況,則會(huì)從上次的ck中讀取出內(nèi)容呻纹,也就是上次ck的狀態(tài)信息堆生,然后執(zhí)行回滾操作保證數(shù)據(jù)的一致性。這一點(diǎn)最后再做介紹雷酪。

snapshotState 方法用于觸發(fā) ck 操作淑仆。
這個(gè)方法做了如下幾件事
1.獲取當(dāng)前正在寫的 .pending 文件的大小,以便若下次 ck 前發(fā)生故障哥力,可以獲知本次ck時(shí)蔗怠,該文件的大小,以便刪除本次ck后到故障發(fā)生時(shí)寫入的數(shù)據(jù)吩跋,或者顯示該文件的有效數(shù)據(jù)大小寞射。
2.將所有 .pending 狀態(tài)的文件存儲(chǔ)到list中,稍后ck結(jié)束后锌钮,方便修改其狀態(tài)為 finish
3.將當(dāng)前狀態(tài)存入 restoredBucketStates 對(duì)象桥温,以便若下次 ck 前發(fā)生故障,可以從這個(gè)狀態(tài)處進(jìn)行恢復(fù)轧粟。

同時(shí)策治,BucketSink也實(shí)現(xiàn)了 CheckpointListener 接口
void notifyCheckpointComplete(long checkpointId) throws Exception;
該方法會(huì)在 ck 完成后調(diào)用脓魏。

2

該方法,將 .pending 文件的狀態(tài)轉(zhuǎn)為 final 狀態(tài)
并且移除writer已經(jīng)處于close狀態(tài)的bucket通惫。

最后詳細(xì)說一下故障恢復(fù)茂翔。
當(dāng)程序因故障自動(dòng)恢復(fù)時(shí),initializeState 方法的 restoredBucketStates 就會(huì)從上次 ck 中獲取到上次ck時(shí)的狀態(tài)履腋。進(jìn)而進(jìn)行恢復(fù)珊燎。

3

首先,將 .pending 狀態(tài)的文件名列表清空即可遵湖,因?yàn)閷?.pending 狀態(tài)轉(zhuǎn)為 finish 狀態(tài)悔政,可以在 notifyCheckpointComplete 方法中完成。故障恢復(fù)時(shí)延旧,該方法對(duì) .pending 的文件的做法是不做處理谋国,等待故障恢復(fù)之后,第一次ck觸發(fā)時(shí)迁沫,便會(huì)自動(dòng)的將 .pending 的文件變?yōu)?finish 狀態(tài)芦瘾。
而之所以不處理 .pending 狀態(tài)文件,是因?yàn)?.pending 狀態(tài)文件說明該文件已經(jīng)寫入完畢集畅,就差ck成功后修改文件狀態(tài)(也就是文件名)而已近弟,本質(zhì)上,該文件已經(jīng)不再寫入數(shù)據(jù)挺智,沒有數(shù)據(jù)的變化祷愉。
接下來 handlePendingInProgressFile 就是處理 .in-progress 狀態(tài)的文件。
我們?cè)O(shè)想一下赦颇,故障重啟是指在上次成功的ck之后二鳄,下次ck之前,發(fā)生了故障媒怯,然后應(yīng)用自動(dòng)重啟泥从,使用的是上次成功的ck的狀態(tài)信息。
這樣的話沪摄,上次 ck 時(shí)狀態(tài)為 .in-progress 的文件,可能在故障發(fā)生時(shí)纱烘,已經(jīng)處于 .pending 狀態(tài)杨拐,也就是寫完的狀態(tài),也可能仍然處于 .in-progress 狀態(tài)擂啥。
flink的做法是哄陶,不管處于什么狀態(tài) 首先全部標(biāo)注為 finish 狀態(tài)。然后根據(jù)上次ck時(shí)狀態(tài)中存儲(chǔ)的文件的大小進(jìn)行截?cái)嗖负@樣屋吨,該文件就能回滾到上次ck成功時(shí)的狀態(tài)蜒谤。若 Hadoop 版本不支持截?cái)嗖僮鳎瑒t新建一個(gè)后綴為 .valid-length 的文件至扰,內(nèi)容為文件的大小鳍徽,單位 byte。
然后flink就可以從上次ck處重新拉取數(shù)據(jù)源敢课,繼續(xù)處理阶祭,寫入sink。
最后直秆,調(diào)用 handlePendingFilesForPreviousCheckpoints 將上次ck成功后濒募,若故障發(fā)生的很快,沒來得及調(diào)用 CheckpointListener 的 notifyCheckpointComplete 方法圾结,則此處將文件狀態(tài)置為 finish 瑰剃。


BucketSink 是一個(gè)控制類,具體的寫入操作可以自己實(shí)現(xiàn) org.apache.flink.streaming.connectors.fs.Writer 接口筝野。
其中 snappy 等壓縮文件的追加晌姚,可以使用
Fs.append 的方式追加內(nèi)容到同一文件中

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市遗座,隨后出現(xiàn)的幾起案子舀凛,更是在濱河造成了極大的恐慌,老刑警劉巖途蒋,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猛遍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡号坡,警方通過查閱死者的電腦和手機(jī)懊烤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宽堆,“玉大人腌紧,你說我怎么就攤上這事⌒罅ィ” “怎么了壁肋?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)籽慢。 經(jīng)常有香客問我浸遗,道長(zhǎng),這世上最難降的妖魔是什么箱亿? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任跛锌,我火速辦了婚禮,結(jié)果婚禮上届惋,老公的妹妹穿的比我還像新娘髓帽。我一直安慰自己菠赚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布郑藏。 她就那樣靜靜地躺著衡查,像睡著了一般。 火紅的嫁衣襯著肌膚如雪译秦。 梳的紋絲不亂的頭發(fā)上峡捡,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音筑悴,去河邊找鬼们拙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛阁吝,可吹牛的內(nèi)容都是我干的砚婆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼突勇,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼装盯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起甲馋,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤埂奈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后定躏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體账磺,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年痊远,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了垮抗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡碧聪,死狀恐怖冒版,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逞姿,我是刑警寧澤辞嗡,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站滞造,受9級(jí)特大地震影響欲间,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜断部,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望班缎。 院中可真熱鬧蝴光,春花似錦她渴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至疆虚,卻和暖如春苛败,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背径簿。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工罢屈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人篇亭。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓缠捌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親译蒂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子曼月,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說明:當(dāng)在唯一索引所對(duì)應(yīng)的列上鍵入重復(fù)值時(shí),會(huì)觸發(fā)此異常柔昼。 O...
    我想起個(gè)好名字閱讀 5,321評(píng)論 0 9
  • feisky云計(jì)算哑芹、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 3,855評(píng)論 0 5
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,105評(píng)論 1 32
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,389評(píng)論 0 5
  • (兩年前的文章)原作者沒有署名,在此標(biāo)明轉(zhuǎn)載文章捕透,源自QQ空間日志聪姿,侵刪 1:主板故障 2:顯卡故障 3:聲卡故障...
    aclihui閱讀 2,171評(píng)論 0 10