flink 关闭窗口(watermark、allowedLateness允许延迟)

一、watermark

介绍在这篇文章https://blog.csdn.net/qq_36951116/article/details/106468171

如果只配置了watermark,没有设置allowedLateness。

当watermark的时间戳大于等于窗口的结束时间时,会触发计算输出一次结果(如果1是全量计算则触发,增量的就不用触发了),然后关闭窗口(清空状态值)

比如设置了watermark延迟时间为3000毫秒,以窗口0~5000毫秒为例,窗口结束时间为5000毫秒

可知watermark=eventTime-3000,

那么当watermark>= 5000时(即evenTime>=3000+5000),窗口0~5000毫秒会被关闭且触发计算。

 

二、调用allowedLateness方法设置了延迟时间

当调用allowedLateness方法设置了允许延迟时间,

如果watermark的时间戳大于等于窗口的结束时间时,不会像第一中一样关闭窗口清空转态,仅仅只会触发一次计算,并且计算结果继续保存为状态,

然后如果接下来watermark还没有超过窗口结束时间+允许延迟时间时,那么此时每来一条符合窗口的记录,则触发一次计算输出。并且把该输出作为对应key的新的状态。直到watermark超过为止。

比如设置了watermark延迟时间为3000毫秒,allowedLateness允许延迟时间为10000毫秒,以窗口0~5000毫秒为例,窗口结束时间为5000毫秒

可知watermark=eventTime-3000,

那么当watermark>= 5000时(即evenTime>=3000+5000),窗口0~5000毫秒会被触发计算输出一次结果,然后该结果会保存为一个状态,后面继续使用(累加等)。

那么当此时watermark>=5000,且watermark<5000+10000时(即未超出允许延迟时间范围),后续flink的输入数据中又来了一堆eventTime在0~5000毫秒之间的数据,此时每来一条数据,则触发一次计算(比如累加,那么就会与之前保存的状态进行累加计算,全量计算的话应该是留到关窗时才计算),

直到当watermark>= 5000+10000时(即evenTime>=3000+5000+10000),窗口0~5000毫秒会被关闭并触发计算

 

三、注意

watermark只与窗口关窗先关时间进行比较,至于窗口开窗时间,还是以eventTime的时间来开启的

 

你可能感兴趣的:(flink)