flink kafka 如何實(shí)現(xiàn) exactly-once語義

  • 要實(shí)現(xiàn)exactly-once語義 flink依賴checkpoint和可重放數(shù)據(jù)源(kafka)
  • checkpoint 觸發(fā)之后會(huì)在數(shù)據(jù)源插入產(chǎn)生checkpoint barrier,等待所有checkpoint barier在所有各個(gè)operator中都實(shí)現(xiàn)對(duì)齊,各個(gè)operator中的checkpoint barrier對(duì)齊都會(huì)想jobmanager報(bào)告,jobmanager收集到所有operator checkpoint barrier對(duì)齊之后,complate checkpoint,在complate之前checkpoint 一直是掛起狀態(tài)

具體實(shí)現(xiàn)步驟

第一步:

如下所示,一個(gè) Kafka topic,有兩個(gè)partition,每個(gè)partition都含有 “A”, “B”, “C”, ”D”, “E” 5條消息。我們將兩個(gè)partition的偏移量(offset)都設(shè)置為0.

第二步:

Kafka comsumer(消費(fèi)者)開始從 partition 0 讀取消息。消息“A”正在被處理,第一個(gè) consumer 的 offset 變成了1。

第三步:

消息“A”到達(dá)了 Flink Map Task。兩個(gè) consumer 都開始讀取他們下一條消息(partition 0 讀取“B”,partition 1 讀取“A”)。各自將 offset 更新成 2 和 1 。同時(shí),F(xiàn)link 的 JobMaster 開始在 source 觸發(fā)了一個(gè)檢查點(diǎn)。

第四步:

接下來,由于 source 觸發(fā)了檢查點(diǎn),Kafka consumer 創(chuàng)建了它們狀態(tài)的第一個(gè)快照(”offset = 2, 1”),并將快照存到了 Flink 的 JobMaster 中。Source 在消息“B”和“A”從partition 0 和 1 發(fā)出后,發(fā)了一個(gè) checkpoint barrier。Checkopint barrier 用于各個(gè) operator task 之間對(duì)齊檢查點(diǎn),保證了整個(gè)檢查點(diǎn)的一致性。消息“A”到達(dá)了 Flink Map Task,而上面的 consumer 繼續(xù)讀取下一條消息(消息“C”)。

第五步:

Flink Map Task 收齊了同一版本的全部 checkpoint barrier 后,那么就會(huì)將它自己的狀態(tài)也存儲(chǔ)到 JobMaster。同時(shí),consumer 會(huì)繼續(xù)從 Kafka 讀取消息。

第六步:

Flink Map Task 完成了它自己狀態(tài)的快照流程后,會(huì)向 Flink JobMaster 匯報(bào)它已經(jīng)完成了這個(gè) checkpoint。當(dāng)所有的 task 都報(bào)告完成了它們的狀態(tài) checkpoint 后,JobMaster 就會(huì)將這個(gè) checkpoint 標(biāo)記為成功。從此刻開始,這個(gè) checkpoint 就可以用于故障恢復(fù)了。值得一提的是,F(xiàn)link 并不依賴 Kafka offset 從系統(tǒng)故障中恢復(fù)。

故障恢復(fù)

在發(fā)生故障時(shí)(比如,某個(gè) worker 掛了),所有的 operator task 會(huì)被重啟,而他們的狀態(tài)會(huì)被重置到最近一次成功的 checkpoint。Kafka source 分別從 offset 2 和 1 重新開始讀取消息(因?yàn)檫@是完成的 checkpoint 中存的 offset)。當(dāng)作業(yè)重啟后,我們可以期待正常的系統(tǒng)操作,就好像之前沒有發(fā)生故障一樣。如下圖所示:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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