这是我参与「第四届青训营 」笔记创作活动的的第1天
第三节:Exactly Once 语义在 Flink 中的实现
数据流与动态表
动态表
在任意时刻都可以将动态表视作SQL的静态表进行查询
连续查询的对比
1. INSERT + UPDATE
2. INSERT
Retract 【回撤】消息
Count + 1 = delete 1; insert 2
状态 —— 有状态的算子
需要存储每一个先前用户的url(但不显示在输出中),在新数据输入时与先前存储的数据进行对比,以便增加次数/接入新表
Exactly-Once 和 Checkpoint
一致性保证语义
- At-most-once:每条数据消费至多一次,处理延迟低
- At-least-once:每条数据消费至少一次,一条数据可能存在重复消费
- Exactly-once:每条数据都被消费且仅被消费一次,仿佛故障从未发生
状态快照与恢复原理
状态快照 —— Chandy-Lamport算法
具体流程
barrier每到一个有状态的节点都会向JobManager反馈
- Checkpoint barrier 的下发
- 算子状态制作和 barrier 传递
Source1/2向JobManager告知barrier已完成
- 多个上游的等待 barrier 对齐现象
barrier到达task,barrier进行对齐
- Checkpoint 并不阻塞算子数据处
- Checkpoint ACK和制作完成
Flink 端到端 Exactly-Once 实现
两阶段提交协议(2PC)
- Coordinator:协作者,同步和协调所有节点处理逻辑的中心节点
- Participant:参与者,被中心节点调度的其他执行处理逻辑的业务节点
操作流程
-
Coordinator向Participant发送Query to commit【预执行】指令;所有Participant预执行事务
-
(1)所有Participant完成预执行后,向Coordinator回复Yes;Coordinator收到后,向Participant发送Commit 【执行】指令;Participant正式执行事务
(2)若有Participant回复No,则Coordinator向Participant发送Rollback 【回滚】指令,释放预执行所占用的空间。回滚完成后,再重新进行流程1
e.g. 两阶段提交协议在 Flink 中的应用
- Flink 中协作者和参与者的角色分配
- 协作者(JobManager)发起阶段一提交
- 各算子 Checkpoint 的制作
- 提交阶段及 Checkpoint 的制作完成