这是我参与「第四届青训营 」笔记创作活动的的第3天,这几天学习了【Exactly Once 语义在 Flink 中的实现】的内容,重点是了解了Flink的checkpoint机制、端到端的Exactly once实现:两阶段提交协议+Flink checkpoint;以及一些案例。
Exactly Once 语义在 Flink 中的实现
动态表
与批处理的静态数据不同,动态表随时间变化。但依旧可用SQL语句进行查询,查询过程不会终止。
数据处理保证
- at most once 不管故障
- at least once 管故障;数据可能被重复处理
- exactly once 管故障,数据被严格消费一次
checkpoint机制
graph LR
source --> 其他算子 --> sink
- 每个source算子收到JM发checkpoint barrier标识快照制作开始
- source算子保存状态后,向下游发checkpoint barrier,并回复JM状态快照完成
- 所有算子回复JM完成,checkpoint机制结束
- 但sink算子可能会重复下发
两阶段提交协议
一个中心节点统一处理,中心结点在协议里被称作协作者,其余被调度节点叫参与者
过程
graph TD
A[1预提交] --> B{所有参与者向协作者反馈vote yes?};
B -->|Yes| C[2提交];
B -->|No| E[3业务回滚];
1.预提交
协作者向参与者发commit
参与者执行事务但不提交
参与者执行成功回复vote yes,失败vote no
2.提交
协作者向参与者发commit
参与者释放事务资源,回复ack给协作者
收到所有参与者ack,该事务执行完成
3.业务回滚
协作者向参与者发rolllback
参与者回滚操作,释放事务资源,回复ack给协作者
收到所有参与者ack,回滚完成
Flink中的应用
JM 作为协作者;其他算子都是参与者
sink算子向下游写数据前开启事务,执行两阶段提交协议,当checkpoint barrier过程全部完成则将事务提交,把数据交付给下游。