上接:flink1.12.x End-to-End 端到端数据一致性:at-most-once、at-least-once
说明
Exactly-Once,精确一次
Flink 应用从 Source 端开始到 Sink 端结束,Flink 自身是 无法保证外部系统 精确一次 的,外部系统也要支持,还要通过 Flink checkpoint 和 两阶段提交 才能实现
应用场景
保证整个应用内端到端的数据一致性,这种情况比较 适合数据要求比较高,不允许出现丢数据或者数据重复
默认模式
由于一致性要求高,因此Flink的 性能也相对较弱
实现方式
source:支持数据重放。将 kafka 偏移量提交到 checkpoint,当程序报错时,从 checkpoint 恢复偏移量,重新从kafka取出数据
算子:状态保存到 checkpoint中,从故障恢复时,从 checkpoint 恢复数据
sink:两阶段提交,从故障恢复时,数据 不会重复写入外部系统。有些sink实现了两阶段提交,比如:kafka,和输出到hdfs的StreamingFileSink。
两阶段提交流程
beginTransaction:初始化一个事务。在有新数据到达并且当前事务为空时调用。
preCommit:预提交数据,即不再写入当前事务并准好提交当前事务。在 sink 算子进行 checkpoint 时调用。
commit:正式提交数据,将准备好的事务提交。在作业的 checkpoint 完成时调用。
abort:放弃事务。在作业 checkpoint 失败的时候调用。
代码
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
参考:
https://developer.aliyun.com/article/714835
https://zhuanlan.zhihu.com/p/94679136
https://zhuanlan.zhihu.com/p/266620519

