在Flink1.12以后,watermark默认是按固定频率周期性的产生.
在Flink1.12版本以前是有两种生成策略的:
AssignerWithPeriodicWatermarks
周期性生成watermark
AssignerWithPunctuatedWatermarks
[已过时] 按照指定标记性事件生成watermark
新版本API
内置的watermark
策略
-
单调递增的watermark生成策略,也就是紧跟最大事件时间(完全不容忍乱序)
WatermarkStrategy.forMonotonousTimestamps();
-
允许乱序的watermark生成策略,最大事件时间 - 容错时间
WatermarkStrategy.forBoundedOutOfOrderness(Duration.ofSeconds(3));
-
自定义的watermark生成策略
WatermarkStrategy.forGenerator(new WatermarkGenerator(){...})
-
Monotonous策略图解
这里时间戳为1
,2
,3
的数据正常进入到0~5
的window
当时间戳为7
的数据进来后,就会将watermark
更新为7
,跟新后0~5
的window
就会进行计算,然后销毁
时间为4
,5
,6
的数据准备进入到5~10
的window
时发现不满足进入条件,这时就会将这三条数据判定为迟到数据,然后就会将这三条数据舍弃掉 -
BoundedOutOfOrderness策略图解
时间戳为1
,2
,3
正常进入到0~ 5
的window
,由于设置的容错时间为3
,所以当时间戳为3
的数据到达之后,watermark
更新为0
(3 - 3
).
当时间戳为7
的数据到达之后,则会进入5~10
的window
当中,watermark
更新为4
(7 - 3
)
因为watermark
在7
到达时只更新到了4
,所以0~5
的window
还没有进行计算,当4
,5
,6
到达之后还可以正常进入到0~5
的window
.
当时间戳为8
的数据到达之后进入到5~10
的window
,更新watermark
为5
(8 - 3
),这时0~5
的window
触发计算并销毁.
关于自定义的策略就没什么可说的了,这个要根据用户自己定义的逻辑生成watermark
,以实际业务需求为基准.