首页 文章

在Flink中检查事件时间水印

提问于
浏览
2

我们正在接受一个号码的活动 . 独立数据源,因此,到达我们的Flink拓扑(通过Kafka)的数据将是无序的 .

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

如果一些事件在设定的阈值之后到达,则简单地忽略这些事件(在我们的情况下这是可以的,因为属于该分钟的大多数事件已经到达并在相应的窗口中被处理) .

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

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

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

1 回答

  • 0

    我认为最简单的解决方案是在窗口运算符后注入 ProcessFunction .

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

相关问题