flink實戰--自定義具有Exactly-Once語義的sink(TwoPhaseCommitSinkFunction)

Exactly-Once 語義

           exactly-once語義指的是每個輸入的事件隻影響最終結果一次。即使機器或軟件出現故障,既沒有重複數據,也不會丟數據。分佈式系統都是關於取捨平衡,基本上存在三種類型的傳遞語義:最多一次at-most-once,至少一次at-least-once和正好一次exactly-once。其中正好一次exactly-once實現最爲困難,本篇文章詳細介紹一下flink如何實現exactly-once語義。

Flink一次性語義實現原理

           說到flink的Exactly-Once,要區分實現的範圍。在 Flink 1.4.0 之前,Exactly-Once 語義僅限於 Flink 應用程序內部,並沒有擴展到 Flink 數據處理完後發送的大多數外部系統。Apache Flink 自2017年12月發佈的1.4.0版本開始,爲流計算引入了一個重要的里程碑特性:TwoPhaseCommitSinkFunction。它提取了兩階段提交協議的通用邏輯,使得通過 Flink 來構建端到端的 Exactly-Once 程序成爲可能。爲了提供端到端的 Exactly-Once 語義 ,除了 Flink 應用程序內部, Flink 寫入的外部系統也需要能滿足 Exactly-Once 語義 - 這些外部系統必須提供提交或回滾的方法,然後通過 Flink 的 checkpoint 機制來協調。

注意:外部系統實現Exactly-Once,必須支持事物機制(kafka 0.11後支持事物)

兩階段提交flink內部執行流程

    今天我們通過示例程序分析兩階段提交的具體流程,程序的主要操作如下:

  1. 從 Kafka 讀取的數據源( Flink 內置的 KafkaConsumer)
  2. 窗口聚合
  3. 將數據寫回 Kafka 的數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章