flink1.12.x End-to-End Exactly-Once端到端数据一致性

上接: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


原文出处:/show_1IX4BaGNyO6y.html