【问题标题】:End-to-end Exactly-once processing in Apache FlinkApache Flink 中的端到端 Exactly-once 处理
【发布时间】:2021-01-16 00:15:26
【问题描述】:

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

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

【问题讨论】:

    标签: apache-kafka apache-flink flink-streaming exactly-once


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 1.因此,Flink 算子之间的消息传递和(总排序)正是由 TCP 保证的。 2. 是否可以肯定地说,Flink 中的端到端恰好一次处理不会造成任何性能下降,除了由事务接收器(两阶段提交)引起的性能下降?谢谢。
    猜你喜欢
    • 2019-12-10
    • 2019-06-23
    • 2021-12-11
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    • 2020-08-26
    相关资源
    最近更新 更多