Flink完全一次消息处理

raz*_*van 2 apache-flink flink-streaming flink-cep

我已经设置了一个Flink 1.2独立集群,其中包含2个JobManagers和3个TaskManagers,我正在使用JMeter通过生成Kafka消息/事件对其进行加载测试,然后对其进行处理.处理作业在TaskManager上运行,通常需要~15K事件/秒.
该作业已设置EXACTLY_ONCE检查点,并将状态和检查点持久保存到Amazon S3.如果我关闭运行作业的TaskManager,它需要几秒钟,然后在另一个TaskManager上恢复作业.该作业主要记录连续整数的事件ID(例如,从0到1200000).
当我检查TaskManager上的输出时,我关闭了最后一次计数,例如500000,然后当我在另一个TaskManager上检查恢复作业的输出时,它以~400000开始.这意味着~100K的重复事件.这个数字取决于测试的速度可以更高或更低.
不确定我是否遗漏了一些东西,但我希望在重新启动不同的TaskManager后,该作业会显示下一个连续的数字(如500001).
有谁知道为什么这发生/额外的设置我必须配置,以获得一次?

Dav*_*son 9

您正在看到完全一次的预期行为.Flink在故障情况下通过检查点和重放的组合实现容错.保证并不是每个事件都会被准确地发送到管道中一次,而是每个事件都会恰好影响管道的状态一次.

检查点在整个​​群集中创建一致的快照.在恢复期间,将恢复操作员状态,并从最近的检查点重放源.

有关更全面的解释,请参阅此数据Artisans博客文章:使用Apache Flink™Flink文档进行高吞吐量,低延迟和一次流处理.