我们正在接受一个号码的活动 . 独立数据源,因此,到达我们的Flink拓扑(通过Kafka)的数据将是无序的 .
我们在Flink拓扑中创建1分钟的事件时间窗口,并在源操作员处生成事件时间水印(当前事件时间 - 某个阈值(30秒)) .
如果一些事件在设定的阈值之后到达,则简单地忽略这些事件(在我们的情况下这是可以的,因为属于该分钟的大多数事件已经到达并在相应的窗口中被处理) .
现在,问题在于,如果程序崩溃(无论出于何种原因),然后从最后一个成功检查点再次恢复,乱序到达事件将触发执行过去(已处理)的窗口(只有极少数事件)那个窗口)压倒prev的结果 . 计算那个窗口 .
如果Flink有检查点事件时间水印,则不会发生此问题 .
所以,我想知道是否有办法在Flink中强制执行事件时间水印的检查点...
1 回答
我认为最简单的解决方案是在窗口运算符后注入
ProcessFunction
.ProcessFunction
可通过其Context
对象访问当前水印,并可将其存储在联合运算符状态 . 如果发生故障,ProcessFunction
将从其状态恢复水印,并过滤所有时间戳小于水印的记录(时间戳也可通过Context
obejct访问) .