flink1.12.x End-to-End 端到端数据一致性:at-most-once、at-least-once 作者:马育民 • 2022-10-01 22:33 • 阅读:10070 # 提出问题 批处理中,如果程序报错,修改程序,重新再执行一遍即可 流式计算是一个 **无边界** 的 **数据流处理过程**,不断的从数据源出读取数据,不断的处理并且输出,对于消费到的上游数据,**有可能刚刚获取到该数据、还未完成计算或者是还未输出到下游,程序就异常重启**,重启之后该如何继续之前的计算? ### 解决 End-to-End Exactly-Once端到端数据一致性,可以解决上面问题 # 说明 ### 端到端 [![](/upload/0/0/1IX42CsfXlnA.png)](/upload/0/0/1IX42CsfXlnA.png) 流式计算中,端到端表示从 **外部读取数据**、**中间算子处理**、**数据输出外部** 三个处理环节。 在理想状态即 `7*24` 任务 **不出错** 或者 **无异常** 情况下,也就是每一步处理都正常,那么就能保证最终处理输出的数据正确 ### 端到端的一致性 在实际的情况中,可能会出现网络、磁盘、脏数据、OOM等各种异常导致程序失败,也就是 **端到端 任何一个处理环节都有可能失败**,为了保证最终数据的正确性,需要提供一种机制保障在面对任何情况的情况下,**任务仍然恢复到正确的状态**,这就是端到端数据一致性 ### 三种处理模式 - at-most-once - at-least-once - exactly-once # at-most-once 表示至多处理一次,在端到端的整个处理流程中,每一个环节至多会被处理一次,通常发生在某一个处理环节在出现失败导致异常的情况下,**下游节点** 是无法获取到该节点的处理数据的,因为 **失败的数据不会被重试或者是恢复** ### 缺点 数据可能丢失 # at-least-once 表示至少处理一次,可能由于中间由于某个环节异常(处理消息异常、提交offset异常等) ,导致 **数据 被 重复处理**,重新进入整个处理流程中 计算结果可能大于正确值,但绝不会小于正确值,就是计算程序发生故障后可能 **多算**,但是绝不可能少算 ### 缺点 数据 可能 重复处理 # exactly-once 详见链接:https://www.malaoshi.top/show_1IX4BaGNyO6y.html 参考 https://cloud.tencent.com/developer/article/1983667 原文出处:http://malaoshi.top/show_1IX49NkxVqCp.html