flink 如何实现端到端的 Exactly-once?
端到端包含 Source, Transformation,Sink 三部分的Exactly-once
- Source:支持数据的replay,如Kafka的offset。
- Transformation:借助于checkpoint
- Sink:Checkpoint + 两阶段事务提交
两阶段提交?
- 一旦Flink开始做checkpoint操作,就会进入pre-commit "预提交"阶段,同时JobManagerCoordinator会将Barrier注入数据流中。
- 当所有的barrier在算子中成功进行一遍传递(就是Checkpoint完成),并完成快照后,"预提交"阶段完成。
- 等所有的算子完成"预提交",就会发起一个commit "提交"动作,但是任何一个"预提交" 失败都会导致Flink回滚到最近的checkpoint。
两阶段提交API
beginTransaction:在开启事务之前,我们在目标文件系统的临时目录中创建一个临时文件,后面在处理数据时将数据写入此文件。
preCommit:在预提交阶段,刷写(flush)文件,然后关闭文件,之后就不能写入到文件了,我们还将为属于下一个检查点的任何后续写入启动新事务。
commit:在提交阶段,我们将预提交的文件原子性移动到真正的目标目录中,请注意,这回增加输出数据可见性的延迟。
abort:在中止阶段,我们删除临时文件。
参考: