几分钟明白Flink水位线

Flink水位线


1、Flink中不同的事件概念
  • Processing time(处理时间): 即事件被机器处理的时间,事件流向某个算子的系统时间
  • Event Time(事件时间): 事件时间是再某个生产设备上发生时间,指事件进入Flink之前嵌入的时间,通常可以从事件中获取一个时间戳,此时间戳可以用来得出水位线,进而解决延迟,乱序,重发等情况
  • Ingestion time(摄入时间): 摄入时间即是事件进入Flink的时间,是在Source Operator中设置的。

2、WaterMark(水位线)

水位线,首先水位线的主要作用是解决数据的延迟和乱序问题,水位线到底是什么?水位线其实可以理解是一个特俗的数据,用来延迟窗口的触发(此处指的窗口每个相互独立),具体情况,下图说明。

几分钟明白Flink水位线_第1张图片


假设场景,比如说上学校车,校车每天早上九点发车,但有一部分学生可能九点零二才能赶来,于是小明偷偷把司机的时间调后了两秒,这样当时间到了九点(延后两秒的九点)大家都能上车了。


初学者:疑难点(误区)

  • ① 水位线如何得出?
    水位线公式:watermark=当前最大事件时间-延迟时间,此公式最后的结果水位线其实代表了前多少个数据已经到齐了,每个数据进入,都会抽取数据的时间戳(事务时间)来生成一个水位线
  • ② 事件时间和数据容易分不清(或者混为一谈)
    上面有讲事件时间,开始数据可能是有序的,但经过并行的处理过程中,数据难免会乱序,图中很容易看出
    ③ 窗口的大小并不代表窗口处理几条数据
    窗口大小两种要么是根据时间,要么根据处理数据个数,视情而定,不要搞混。
    ④ 窗口5s秒的理解
    窗口五秒大小范围是【0,5)。

3、WaterMark的迟到数据

现实中很难生成一个完美的水位线,水位线就是在延迟与准确性之前做的一种权衡。那么,如果生成的水位线过于紧迫,即水位线可能会大于后来数据的时间戳,这就意味着数据有延迟,关于延迟数据的处理,Flink提供了一些机制,具体如下:

  • ① 直接将迟到的数据丢弃
  • ② 将迟到的数据输出到单独的数据流中,即使用sideOutputLateData(newOutputTag<>())实现侧输出
  • ③ 根据迟到的事件更新并发出结果
    其实就是水位线不一定能解决全部延迟数据,主要是处理毫秒内的数据延迟,延迟过大的数据会有剩余方案进行处理~
  • 若还有别的疑问欢迎留言~,有说错之处还请指出

你可能感兴趣的:(Java+大数据之旅,日常一学,Flink,watermark)