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