Watermark(水位线)
数据产生时是有序的,但是考虑到网络延迟,它们到达Flink时,有可能时乱序的,先发生的事件延时到达。为了解决事件延时到达(或者说减少延时数据对计算结果的影响),有了watermark机制。
watermark有个参数允许延迟时间,举例:
窗口大小=10s,允许延迟时间=5s。
当事件时间>=10:08:08 00:00:10的事件到时,Flink不认为事件时间=[10:08:08 00:00:00, 10:08:08 00:00:10)事件都到了。
当事件时间>=10:08:08 00:00:15的事件到时,Flink会认为事件时间=[10:08:08 00:00:00, 10:08:08 00:00:10)事件都到了(虽然有可能还有数据没到,但是不等那些了)。
注意上面我用的左闭右开,但是根据Flink官网文档理解,10:08:08 00:00:10这个事件也到了。但是窗口计算左闭右开。
在Flink中,watermark是一种特殊的事件,它只包含时间戳,它被安插在数据流中。
如下图:
三角形的事件5到时,Flink不会认为<5的事件都到了,当到圆形watermark5时,才认为<5的事件都到了。
这时延时到达的事件3会被在窗口中计算,但是事件4迟迟没来,就不等了,事件4就被丢弃了。