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

Vij*_*sal 5 apache-flink checkpointing flink-streaming

我们正在从一个号码接收事件。独立的数据源,因此,到达我们的 Flink 拓扑(通过 Kafka)的数据将是无序的。

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

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

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

如果 Flink 有检查点事件时间水印,这个问题就不会发生。

所以,我想知道是否有办法在 Flink 中强制执行事件时间水印的检查点......

Fab*_*ske 3

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

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