跳到主要内容

27、Flink深入:Flink中的Watermark

1. 什么是Watermark

Watermaker就是给数据再额外的加的一个时间列,也就是Watermaker是个时间戳!

2. 如何计算Watermark

定义:
    Watermaker = 数据的事件时间  -  最大允许的延迟时间或乱序时间
注意:后面通过源码会发现,准确来说:
    Watermaker = 当前窗口的最大的事件时间  -  最大允许的延迟时间或乱序时间

这样可以保证Watermaker水位线会一直上升(变大),不会下降

3. Watermark有什么用

之前的窗口都是按照系统时间来触发计算的,如: [10:00:00 ~ 10:00:10) 的窗口,
一但系统时间到了10:00:10就会触发计算,那么可能会导致延迟到达的数据丢失! 
那么现在有了Watermaker,窗口就可以按照Watermaker来触发计算! 
也就是说Watermaker是用来触发窗口计算的!

4. Watermark是如何触发窗口计算的

窗口计算的触发条件为:
    1.窗口中有数据
    2.Watermaker >= 窗口的结束时间

-----------------

因为前面说到  Watermaker = 当前窗口的最大的事件时间  -  最大允许的延迟时间或乱序时间
也就是说只要不断有数据来,就可以保证Watermaker水位线是会一直上升/变大的,不会下降/减小的,所以最终一定是会触发窗口计算的

-----------------

注意,上面的触发公式进行如下变形:
    Watermaker >= 窗口的结束时间 
    Watermaker = 当前窗口的最大的事件时间  -  最大允许的延迟时间或乱序时间
    当前窗口的最大的事件时间  -  最大允许的延迟时间或乱序时间  >= 窗口的结束时间
    当前窗口的最大的事件时间  >= 窗口的结束时间 +  最大允许的延迟时间或乱序时间

5. 图解Watermark