Topic(主題與分區)
-
Kafka將事件流,組織爲不同的主題(Topic)。
-
每個主題都是一個事件日誌,其事件讀取順序和寫入順序完全相同。
-
爲了實現主體讀寫的伸縮性,Kafka允許用戶在創建topic時定義分區,即將topic拆分爲多個分區分散在集羣上。
-
同時對每個分區上的事件提供保序,但kafka不能保證不同分區之間的事件順序,因此kafka提供了offset偏移量這個概念,來保證就算你讀取的數據在不同的分區上也能通過偏移量實現與輸入順序相同的順序來進行讀取
Flink_Kafka連接器(flink-connector-kafka_2.12)
-
Flink_Kafka連接器會以並行的方式獲取事件流。(如下方圖片所示)每個並行的數據源任務都可以從一個或多個分區中讀取數據。並通過維護偏移量來保證各分區之間數據的順序,如果程序開啓檢查點的話,Flink會將偏移量記錄到檢查點中。
-
因此當程序因爲故障而要從檢查點處進行恢復的時候,Flink kafka依賴的是記錄在檢查點中的偏移量,而非Kafka自身所提供的消費者組(consumer group)
舉例: 當你從檢查點恢復的時候,你的代碼中kafka設置的偏移量是從最近的一次開始讀取,但實際上,你是從程序失敗處讀取Kafka的數據,而非最近的一次Kafka數據。
Flink_Kafka提取事件時間生成水位線
Flink中基於事件時間的操作需要我們定義水位線,那麼在flink kafka中我們如何提取Kafka分區中的事件時間並定義水位線呢?
可以通過調用FlinkKakfkaConsumer. assignTimestampsAndWatermarks()方法.同時向kafka消費者提供一個AssignerWithPeriodicWatermarks對象來定義水位線。
爲了利用Kafka各個分區的保序性特徵,分配器會在每個分區上定義水位線,然後再對各個分區之間的水位線進行合併。
注意:
如果某一分區變成非活躍狀態且不再提供消息,那麼這個數據源任務的水位線將無法前進,繼而導致整個應用的水位線都不會前進。因此單個非活躍的分區會導致整個應用停止運行。