1 watermark产生的缘由
Flink中流处理从事件产生,到流经source,再到operator,中间是有一个过程和时间的。虽然大部分情况下,流到operator的数据都是按照事件产生的时间顺序来的,但是也不排除由于网络、背压等原因,导致乱序的产生(out-of-order或者说late element)。
但是对于late element,我们又不能无限期的等下去,必须要有个机制来保证一个特定的时间后,必须触发window去进行计算了。这个特别的机制,就是watermark。
2 watermark作用的总结
2.1 概念与理解
1)能够解决乱序的问题
2)表示事件时间的进展
3)表示一个时间戳
4)是单调递增的
5)认为在其之前的数据都处理过
2.2 官方提供的watermark的实现
1)升序时,watermark = EvenTime-1ms
此时 watermark >=EvenTime-1ms会触发关闭窗口的命令
2)乱序时,watermark = EventTime - 等待时间
此时 watermark >=EvenTime-1ms会触发关闭窗口的命令
2.3 watermark的传递,并行度的影响
以多个并行子任务中,watermark以最小的为准(木桶原理)
2.4 有界流的问题
有界流在关闭之前,会把watermark设置为Long的最大值===>目的是为了保证所有窗口能够接收到所有数据。