0

Apache Flink 通过从检查点恢复作业来保证在故障和恢复时只进行一次处理,检查点是分布式数据流和操作员状态的一致快照(分布式快照的 Chandy-Lamport 算法)这保证在故障转移时只发生一次。

在正常集群操作的情况下,Flink 如何保证只处理一次,例如给定一个从外部源(例如 Kafka)读取的 Flink 源,Flink 如何保证从源中读取一次事件?事件源和 Flink 源之间是否有任何类型的应用程序级别的确认?另外,Flink 如何保证事件从上游算子到下游算子只传播一次?这是否也需要对收到的事件进行任何类型的确认?

4

1 回答 1

5

Flink 不保证每个事件都从源中读取一次。相反,它保证每个事件只影响托管状态一次。

检查点包括源偏移量,并且在检查点还原期间,源会倒带并且可能会重播某些事件。这很好,因为检查点包括整个作业中的状态,该状态是从读取所有内容直到存储在检查点中的偏移量产生的,除了这些偏移量之外没有任何内容。

因此 Flink 的恰好一次保证需要可重放的源。运营商之间的消息传递恰好依赖于 tcp。

保证接收器不接收重复的结果进一步需要事务接收器。Flink 提交事务作为检查点的一部分。

于 2020-09-30T10:43:08.297 回答