Flink Watermark的原理
Watermark是什么?Watermark就是一个时间戳,它先从输入文件中抽取到EventTime,如果不设最大延迟时间,那么这个时间就是Watermark,你也可以设置一个最大延迟时间,减去这个最大延迟时间就可以得到watermark。
Watermark的是为了处理乱序到达而设立的。什么意思?事件发生是有先后顺序的,但是当他们到达flink的时间可能和这个顺序不一样,这就叫乱序。如果不是流式文件,我们可以怎么处理?我们可以分配一块缓存,等待所有事件到达后,再根据它们的时间戳排个序,这样乱序的问题就解决了。
Watermark也是这个原理,它是结合时间窗口来使用的。时间窗口是一个个有边界的时间段,根据watermark的值把事件放到对应的窗口中,然后各个窗口里按顺序执行就行了。
这就是watermark的原理,但是这些和水位线的概念也没什么关系。水位线的作用,是决定什么时候处理窗口。比如说一个窗口的时间是[10,15),这个时候来了一个16的watermark,watermark是考虑了最大延迟时间的,也就意味着,不会有watermark小于16的事件到了,当然也不会有事件落到[10,15)之间了,这个时候就可以处理[10,15]这个窗口了。
当然,最大延迟时间是我们人为设定的,实际情况下可能还是有事件迟到,迟到事件如何处理,那就是另一个问题了,和watermark没有关系了。