如何實現(xiàn)直接在數(shù)據(jù)源上使用Watermark?
當使用 Apache Kafka 連接器作為數(shù)據(jù)源時,每個 Kafka 分區(qū)可能有一個簡單的事件時間模式(遞增的時間戳或有界無序)。然而,當使用 Kafka 數(shù)據(jù)源時,多個分區(qū)常常并行使用,因此交錯來自各個分區(qū)的事件數(shù)據(jù)就會破壞每個分區(qū)的事件時間模式(這是 Kafka 消費客戶端所固有的)。
在這種情況下,你可以使用 Flink 中可識別 Kafka 分區(qū)的 watermark 生成機制。使用此特性,將在 Kafka 消費端內(nèi)部針對每個 Kafka 分區(qū)生成 watermark,并且不同分區(qū) watermark 的合并方式與在數(shù)據(jù)流?shuffle?時的合并方式相同。
例如,如果每個 Kafka 分區(qū)中的事件時間戳嚴格遞增,則使用時間戳單調(diào)遞增按分區(qū)生成的 watermark 將生成完美的全局 watermark。
注意,我們在示例中未使用 TimestampAssigner,而是使用了 Kafka 記錄自身的時間戳。
下圖展示了如何使用單 kafka 分區(qū) watermark 生成機制,以及在這種情況下 watermark 如何通過 dataflow 傳播。
在實際的計算中,往往會出現(xiàn)一個作業(yè)中會處理多個source的數(shù)據(jù), 對source的數(shù)據(jù)進行g(shù)roupBy分組,那么來自不同source的相同的key會shuffle到同一個處理節(jié)點. 并且攜帶各自的Watermark。
Flink內(nèi)部要保證Watermark的單調(diào)遞增,多個source的Watermark匯聚到一起是不可能單調(diào)遞增的。
Flink內(nèi)部實現(xiàn)每一個邊上只能有一個遞增的Watermark, 當出現(xiàn)多個流攜帶EventTime匯聚到一起(groupBy或者Union)。Flink會選擇所有輸入流中EventTime中最小的一個向下游流出。從而保證Watermark的單調(diào)遞增和數(shù)據(jù)的完整性。

需求
讀取kafkaconsumer并設(shè)置水印機制
操作步驟
1. 獲取流執(zhí)行環(huán)境,設(shè)置并行度1
2. 創(chuàng)建FlinkKafkaConsumer和相應(yīng)的配置
3. 設(shè)置consumer的水印機制為20
4. 通過consumer添加數(shù)據(jù)源
5. 根據(jù)滾動處理時間窗口5s做wordcount,先flatMap,keyBy,window,sum
6. 打印輸出
7. 執(zhí)行流環(huán)境
參考代碼
