提出问题
批处理中,如果程序报错,修改程序,重新再执行一遍即可
流式计算是一个 无边界 的 数据流处理过程,不断的从数据源出读取数据,不断的处理并且输出,对于消费到的上游数据,有可能刚刚获取到该数据、还未完成计算或者是还未输出到下游,程序就异常重启,重启之后该如何继续之前的计算?
解决
End-to-End Exactly-Once端到端数据一致性,可以解决上面问题
说明
端到端
流式计算中,端到端表示从 外部读取数据、中间算子处理、数据输出外部 三个处理环节。
在理想状态即 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
