詳解WatermarkStrategy在Flink中的兩種使用方式
在Flink1.11中就已經(jīng)發(fā)現(xiàn)assignTimestampsAndWatermarks的有些實現(xiàn)過渡了,從Flink1.12版本開始,官網(wǎng)推薦用WatermarkStrategy。

背景
在flink 1.11之前的版本中,提供了兩種生成水?。╓atermark)的策略,分別是AssignerWithPunctuatedWatermarks和AssignerWithPeriodicWatermarks,這兩個接口都繼承自TimestampAssigner接口。
但是用戶想要使用不同的水印生成方式,則需要實現(xiàn)不同的接口,這樣就引發(fā)了一個問題,對于想要給水印添加一些通用的、公共的功能則變得復雜,因為我們需要同時給這兩個接口添加新的功能,這樣還造成了代碼的重復。
所以為了避免代碼的重復,在flink 1.11中對flink的水印生成接口(WatermarkStrategy)進行了重構。
Watermark應用代碼結構
WatermarkStrategy在Flink中有兩種使用方式:
一種是直接在數(shù)據(jù)源上使用
另一種是直接在非數(shù)據(jù)源的操作之后使用
推薦使用第一種方式,因為數(shù)據(jù)源可以利用watermark生成邏輯中有關分片/分區(qū)的信息。使用這種方式可以更精準的跟蹤watermark,整體的watermark生成將更精準,直接在數(shù)據(jù)源指定watermarkStrategy必須使用特定的數(shù)據(jù)源接口,例如與kafka鏈接,使用kafka Connerctor,只有當無法直接在數(shù)據(jù)源上設置策略時才使用第二種方式
在數(shù)據(jù)源直接使用時如果因為數(shù)據(jù)源中的任何一個分區(qū)/分片在一段時間內(nèi)未發(fā)送事件數(shù)據(jù),則意味著watermarkStrategy也不會獲得數(shù)據(jù)去生成watermark,在這種情況下可以通過設置有一個空閑時間,當超過這個時間則將該分片或分區(qū)標記為空閑狀態(tài)。
