给出,
我有一个Flink作业,它从ActiveMQ
源读取并写入mysql数据库-键入标识符。我每隔一秒钟就为该作业启用检查点。我将检查点指向Minio
实例,我验证了检查点正在与jobid
配合使用。我部署的工作是Openshift(位于下面的Kubernetes)-我可以根据需要按&扩展/缩小该工作。
问题
当部署(滚动)作业或由于错误/错误导致作业中断,并且ActiveMQ中有未使用的消息或Flink中有未确认的消息(但已写入数据库)时,作业恢复时(或部署新作业),则作业进程已经处理过消息,导致在数据库中插入了重复的记录。
问题
jobid
在每个部署上不断变化,恢复如何进行?Exactly-Once
)中,我可以编写特定于数据库的查询(upsert
)进行更新是否存在给定记录,否则插入?答案 0 :(得分:0)
JDBC当前仅支持至少一次,这意味着您在恢复时会收到重复的消息。当前有一个草案可以添加对exactly once的支持,该草案可能会在1.11中发布。
检查点是否有助于工作从其离开的地方恢复过来?
是的,但是最后一次成功检查点与恢复之间的时间可能会产生观察到的重复项。我在某个相关的主题上提供了更详细的answer。
(滚动)部署新作业之前,我应该接受检查点吗?
绝对。您实际上应该使用带有保存点的取消。这是更改拓扑的唯一可靠方法。此外,使用保存点取消操作可以避免数据中的重复项,因为它可以正常关闭作业。
如果作业因错误或群集故障而退出会发生什么情况?
它应该自动重启(取决于您的重启设置)。它将使用最新的检查点进行恢复。肯定会导致重复。
随着Jobid在每个部署上不断变化,恢复如何进行?
您通常会明确指向同一检查点目录(在S3上?)。
由于我无法从数据库中获得幂等性,因此upsert是实现Exactly-Once处理的唯一方法吗?
目前,我没有找到解决方法。应该以1.11更改。