Apache flink Flink中的检查点事件时间水印

Apache flink Flink中的检查点事件时间水印,apache-flink,flink-streaming,checkpointing,Apache Flink,Flink Streaming,Checkpointing,我们正在接收来自大量独立数据源的事件,因此,到达Flink拓扑(通过Kafka)的数据将出现故障 我们正在Flink拓扑中创建1分钟的事件时间窗口,并在源操作符处生成事件时间水印(当前事件时间-某些阈值(30秒)) 如果一些事件在设置的阈值之后到达,那么这些事件将被忽略(在我们的例子中这是可以的,因为属于该分钟的大多数事件都已经到达并在相应的窗口中得到处理) 现在的问题是,如果程序崩溃(无论出于何种原因),然后从最后一个成功的检查点再次恢复,无序到达的事件将触发过去(已处理)窗口的执行(该窗口中

我们正在接收来自大量独立数据源的事件,因此,到达Flink拓扑(通过Kafka)的数据将出现故障

我们正在Flink拓扑中创建1分钟的事件时间窗口,并在源操作符处生成事件时间水印(当前事件时间-某些阈值(30秒))

如果一些事件在设置的阈值之后到达,那么这些事件将被忽略(在我们的例子中这是可以的,因为属于该分钟的大多数事件都已经到达并在相应的窗口中得到处理)

现在的问题是,如果程序崩溃(无论出于何种原因),然后从最后一个成功的检查点再次恢复,无序到达的事件将触发过去(已处理)窗口的执行(该窗口中只有一小部分事件)覆盖上一个检查点的结果。该窗口的计算

如果Flink检查了事件时间水印,则不会发生此问题


因此,我想知道是否有一种方法可以在Flink中强制执行事件时水印的检查点…

我认为最简单的解决方案是在窗口操作符之后插入一个
ProcessFunction

ProcessFunction
可通过其
上下文
对象访问当前水印,并可将其存储在联合运算符状态。 如果出现故障,
ProcessFunction
将水印从其状态恢复,并过滤时间戳小于水印的所有记录(时间戳也可通过
上下文
obejct访问)