Flink晚到的数据怎么更新之前窗口计算的结果

最近有一个朋友问我,Flink使用窗口计算的时候,如果设置了允许数据晚到时间,这个时候又来了一条属于前面窗口的数据,但是前面窗口的计算结果已经写到mysql了,怎么更正之前的结果,而不是在写入一条数据呢?今天这篇文章就来介绍一下怎么使用Flink的窗口函数更新之前计算的不完全的(不准确的结果)

对于晚到的数据,一般有几种常用的处理方式:

1,直接丢弃掉(这个也是窗口的默认做法,也就是说一个迟到的元素不会创建一个新的窗口)

2,用测流输出的方式,拿到晚到的元素,可以进行,相关的逻辑处理,或者保存起来.

3,更新之前的窗口计算结果,也就是今天要介绍的做法.

由于存在晚到的元素,所以已经计算出的窗口结果是不准确和不完全的。我们可以使用迟到元素更新已经计算完的窗口结果。

如果我们要求一个operator支持重新计算和更新已经发出的结果,就需要在第一次发出结果以后也要保存之前所有的状态。但显然我们不能一直保存所有的状态,肯定会在某一个时间点将状态清空,而一旦状态被清空,结果就再也不能重新计算或者更新了。而迟到的元素只能被抛弃或者发送到侧输出流。

window operator API提供了方法来明确声明我们要等待迟到元素。当使用event-time window,我们可以指定一个时间段叫做allowed lateness。window operator如果设置了allowed lateness,这个window operator在水位线没过窗口结束时间时也将不会删除窗口和窗口中的状态。窗口会在一段时间内(allowed lateness设置的)保留所有的元素。

当迟到元素在allowed lateness时间内到达时,这个迟到元素会被实时处理并发送到触发器(trigger)。当水位线没过了窗口结束时间+allowed lateness时间时,窗口会被删除,并且所有后来的迟到的元素都会被丢弃。

首先来看一下具体的代码实现:</

猜你喜欢

转载自blog.csdn.net/xianpanjia4616/article/details/106005985