Flink exactly-once 消息处理

Flink exactly-once message processing

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

您看到的是 exactly-once 的预期行为。 Flink 在失败的情况下通过检查点和重放的组合实现 fault-tolerance。保证不是每个事件都将恰好一次发送到管道中,而是每个事件只会影响管道的状态一次。

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

有关更详尽的解释,请参阅此数据工匠博客 post:High-throughput, low-latency, and exactly-once stream processing with Apache Flink™, or the Flink docs