大白话flink watermark 水位线 最大乱序时间

2022-08-01,,

flink watermark水位线是什么?最大乱序时间是什么?初次接触者往往比较蒙,
可能有人理解是这样:如果最大乱序时间设为10s,是不是指本应该触发窗口计算的时间点延后10s计算,以便等待更多的数据,这样不就达到处理迟到的数据的目的了么
事实是这样么?
我们先来说说在以事件时间作为窗口时间的计算触发规则:
没什么为什么,就是这么定义的:
1.窗口内有数据,2.水位线时间>=窗口的结束时间
我们先假定窗口内肯定有数据,那水位线时间怎么样能>=窗口时间呢?
大白话解释一下:
水位线其实就是一个时间戳,用来和窗口时间做比较
流数据中每来一条数据,我们设定水位线生成计算公式:(新来数据里的时间戳-最大乱序时间)
结果有两个:
1:结果>上一次计算水位线时间,则本次水位线时间就是这条数据的时间戳,就是水位往上抬了,离窗口结束的时间点就进了一步
2:结果<=上一次计算的水位线时间,则本次水位线时间还是上次的时间,水位线不变,离窗口结束的时间点没有进步

有没有看出什么端倪?
我们近似可以这么理解:最大乱序时间与水位线的抬升速度是负相关的:
最大乱序时间越大:公式:(新来数据里的时间戳-最大乱序时间)的结果就越小,水位提升的速度就越慢,那水位线时间就越不容易越过窗口结束时间触发窗口计算,窗口内缓存的数据就越多,就容纳越多的迟到数据
最大乱序时间越小:公式:(新来数据里的时间戳-最大乱序时间)的结果就越大,水位提升的速度就越快,那水位线时间就很容易越过窗口结束时间从而触发窗口计算,这个时候再有迟到数据就被丢弃掉了(当然可以自定义处理)
由此可见:最大乱序时间是为生成水位线时间设定的一个中间变量,而不是上面理解的本来要触发的时间点延后多少秒,
实际上flink初学者,经常会碰到一个问题,以事件时间作为窗口时间,明明数据在源源不断流入,可在窗口内却迟迟不见数据输出,这就很可能是因为你的最大乱序时间设定很大,或者流中时间戳有问题,导致水位线迟迟不能提升越过窗口结束时间,不触发窗口计算

本文地址:https://blog.csdn.net/weixin_42094092/article/details/107499797

《大白话flink watermark 水位线 最大乱序时间.doc》

下载本文的Word格式文档,以方便收藏与打印。