我有一个从kafka读取数据的flink作业,从redis读取一些内容然后将聚合的窗口数据写入redis接收器(redis写入实际上是调用加载到redis中的lua脚本来增加现有值,所以我只能在这里增加而不是更新) .
问题是,当我停止工作(维护,代码更改等)时,即使使用保存点,我也必须在重新开始时将重复数据写入redis或丢失一些数据,因为据我所知, redis sink对语义没有保证(确切/至少/最多一次) .
问题是 - 是否有某种关闭信号可以让我干净地关闭工作以确保一次语义?
换句话说,我正在寻找的是:
-
收到关机信号(取消作业?)
-
停止从kafka读取并提交偏移量(已在连接器内完成?)
-
完成处理剩余数据(窗口很短 - 翻滚窗口15秒,处理时间)
-
将最后一个窗口的最后一个输出写回redis
-
关闭工作
这可能吗?关于如何处理停机时间(计划/计划外)的任何其他想法都将受到欢迎 .
1 回答
从版本1.2开始,Flink取消了保存点操作,可以从CLI和其他API获得 . 请参阅docs和pull request .