水位线,首先水位线的主要作用是解决数据的延迟和乱序问题,水位线到底是什么?水位线其实可以理解是一个特俗的数据,用来延迟窗口的触发(此处指的窗口每个相互独立),具体情况,下图说明。
假设场景,比如说上学校车,校车每天早上九点发车,但有一部分学生可能九点零二才能赶来,于是小明偷偷把司机的时间调后了两秒,这样当时间到了九点(延后两秒的九点)大家都能上车了。
初学者:疑难点(误区)
- ① 水位线如何得出?
水位线公式:watermark=当前最大事件时间-延迟时间
,此公式最后的结果水位线其实代表了前多少个数据已经到齐了,每个数据进入,都会抽取数据的时间戳(事务时间)来生成一个水位线- ② 事件时间和数据容易分不清(或者混为一谈)
上面有讲事件时间,开始数据可能是有序的,但经过并行的处理过程中,数据难免会乱序,图中很容易看出
③ 窗口的大小并不代表窗口处理几条数据
窗口大小两种要么是根据时间,要么根据处理数据个数,视情而定,不要搞混。
④ 窗口5s秒的理解
窗口五秒大小范围是【0,5)。
现实中很难生成一个完美的水位线,水位线就是在延迟与准确性之前做的一种权衡。那么,如果生成的水位线过于紧迫,即水位线可能会大于后来数据的时间戳,这就意味着数据有延迟,关于延迟数据的处理,Flink提供了一些机制,具体如下:
- ① 直接将迟到的数据丢弃
- ② 将迟到的数据输出到单独的数据流中,即使用sideOutputLateData(newOutputTag<>())实现侧输出
- ③ 根据迟到的事件更新并发出结果
其实就是水位线不一定能解决全部延迟数据,主要是处理毫秒内的数据延迟,延迟过大的数据会有剩余方案进行处理~