我们正在接收来自大量独立数据源的事件,因此,数据到达我们的flink拓扑(通过kafka)将是无序的。
我们在flink拓扑中创建1分钟的事件时间窗口,并在源操作符处生成事件时间水印(当前事件时间-某个阈值(30秒))。
如果一些事件在设置的阈值之后到达,那么这些事件将被忽略(在我们的示例中,这是可以的,因为属于该分钟的大多数事件都已经到达并在相应的窗口中得到处理)。
现在的问题是,如果程序崩溃(无论出于什么原因),然后从最后一个成功的检查点再次恢复,无序到达的事件将触发过去(已处理)窗口的执行(该窗口中只有极小的事件)覆盖prev的结果。计算那个窗口。
如果flink检查了事件时间水印,这个问题就不会发生。
所以,我想知道是否有一种方法来执行事件时间水印的检查点在flink。。。
1条答案
按热度按时间jaql4c8m1#
我认为最简单的办法是注射
ProcessFunction
在窗口操作符之后。这个
ProcessFunction
可以通过其Context
对象,并可以将其存储在联合运算符状态。如果发生故障ProcessFunction
将水印从其状态恢复并过滤时间戳小于水印的所有记录(时间戳也可以通过Context
obejct)。