訂閱
糾錯
加入自媒體

Flink可靠性的基石-checkpoint機制詳細解析

2021-06-02 17:59
園陌
關(guān)注

Flink

在 Flink 中需要端到端精準(zhǔn)一次處理的位置有三個:

Flink 端到端精準(zhǔn)一次處理

Source 端:數(shù)據(jù)從上一階段進入到 Flink 時,需要保證消息精準(zhǔn)一次消費。

Flink 內(nèi)部端:這個我們已經(jīng)了解,利用 Checkpoint 機制,把狀態(tài)存盤,發(fā)生故障的時候可以恢復(fù),保證內(nèi)部的狀態(tài)一致性。不了解的小伙伴可以看下我之前的文章:

Flink可靠性的基石-checkpoint機制詳細解析

Sink 端:將處理完的數(shù)據(jù)發(fā)送到下一階段時,需要保證數(shù)據(jù)能夠準(zhǔn)確無誤發(fā)送到下一階段。

在 Flink 1.4 版本之前,精準(zhǔn)一次處理只限于 Flink 應(yīng)用內(nèi),也就是所有的 Operator 完全由 Flink 狀態(tài)保存并管理的才能實現(xiàn)精確一次處理。但 Flink 處理完數(shù)據(jù)后大多需要將結(jié)果發(fā)送到外部系統(tǒng),比如 Sink 到 Kafka 中,這個過程中 Flink 并不保證精準(zhǔn)一次處理。

在 Flink 1.4 版本正式引入了一個里程碑式的功能:兩階段提交 Sink,即 TwoPhaseCommitSinkFunction 函數(shù)。該 SinkFunction 提取并封裝了兩階段提交協(xié)議中的公共邏輯,自此 Flink 搭配特定 Source 和 Sink(如  Kafka 0.11 版)實現(xiàn)精確一次處理語義(英文簡稱:EOS,即 Exactly-Once Semantics)。

Flink端到端精準(zhǔn)一次處理語義(EOS)

注:以下內(nèi)容適用于 Flink 1.4 及之后版本

對于 Source 端:Source 端的精準(zhǔn)一次處理比較簡單,畢竟數(shù)據(jù)是落到 Flink 中,所以 Flink 只需要保存消費數(shù)據(jù)的偏移量即可, 如消費 Kafka 中的數(shù)據(jù),F(xiàn)link 將 Kafka Consumer 作為 Source,可以將偏移量保存下來,如果后續(xù)任務(wù)出現(xiàn)了故障,恢復(fù)的時候可以由連接器重置偏移量,重新消費數(shù)據(jù),保證一致性。

對于 Sink 端:Sink 端是最復(fù)雜的,因為數(shù)據(jù)是落地到其他系統(tǒng)上的,數(shù)據(jù)一旦離開 Flink 之后,F(xiàn)link 就監(jiān)控不到這些數(shù)據(jù)了,所以精準(zhǔn)一次處理語義必須也要應(yīng)用于 Flink 寫入數(shù)據(jù)的外部系統(tǒng),故這些外部系統(tǒng)必須提供一種手段允許提交或回滾這些寫入操作,同時還要保證與 Flink Checkpoint 能夠協(xié)調(diào)使用(Kafka 0.11 版本已經(jīng)實現(xiàn)精確一次處理語義)。

我們以 Flink 與 Kafka 組合為例,F(xiàn)link 從 Kafka 中讀數(shù)據(jù),處理完的數(shù)據(jù)在寫入 Kafka 中。

為什么以Kafka為例,第一個原因是目前大多數(shù)的 Flink 系統(tǒng)讀寫數(shù)據(jù)都是與 Kafka 系統(tǒng)進行的。第二個原因,也是最重要的原因 Kafka 0.11 版本正式發(fā)布了對于事務(wù)的支持,這是與Kafka交互的Flink應(yīng)用要實現(xiàn)端到端精準(zhǔn)一次語義的必要條件。

當(dāng)然,F(xiàn)link 支持這種精準(zhǔn)一次處理語義并不只是限于與 Kafka 的結(jié)合,可以使用任何 Source/Sink,只要它們提供了必要的協(xié)調(diào)機制。

Flink 與 Kafka 組合

Flink 應(yīng)用示例

如上圖所示,F(xiàn)link 中包含以下組件:

一個 Source,從 Kafka 中讀取數(shù)據(jù)(即 KafkaConsumer)

一個時間窗口化的聚會操作(Window)

一個 Sink,將結(jié)果寫入到 Kafka(即 KafkaProducer)

若要 Sink 支持精準(zhǔn)一次處理語義(EOS),它必須以事務(wù)的方式寫數(shù)據(jù)到 Kafka,這樣當(dāng)提交事務(wù)時兩次 Checkpoint 間的所有寫入操作當(dāng)作為一個事務(wù)被提交。這確保了出現(xiàn)故障或崩潰時這些寫入操作能夠被回滾。

當(dāng)然了,在一個分布式且含有多個并發(fā)執(zhí)行 Sink 的應(yīng)用中,僅僅執(zhí)行單次提交或回滾是不夠的,因為所有組件都必須對這些提交或回滾達成共識,這樣才能保證得到一個一致性的結(jié)果。Flink 使用兩階段提交協(xié)議以及預(yù)提交(Pre-commit)階段來解決這個問題。

1  2  下一頁>  
聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

    掃碼關(guān)注公眾號
    OFweek人工智能網(wǎng)
    獲取更多精彩內(nèi)容
    文章糾錯
    x
    *文字標(biāo)題:
    *糾錯內(nèi)容:
    聯(lián)系郵箱:
    *驗 證 碼:

    粵公網(wǎng)安備 44030502002758號