这是我参与「第四届青训营 」笔记创作活动的第3天,在第三节课中主要了解到了Exactly Once语义在Flink中的实现.
一、数据流和动态表
随处可见的流式数据
传统SQL和流处理
数据流和动态表转换
- 动态表:与表示批处理数据的静态表不同,动态表是随时间变化的。可以像查询静态批处理表一样查询它们。数据库表时INSERT、UPDATE和DELETE DML语句的stream的结果,通常称为changelog stream。
连续查询
连续查询:
- 查询从不终止
- 查询结果会不断更新,产生一个新的动态表
查询产生仅追加数据的动态表
两个连续查询对比
Retract消息的产生
数据流和动态表转换回顾
- 数据流和动态表之间的转换
- 在数据流的查询不会终止
- 查询可能会有状态,用来不断更新查询的结果
不同数据处理保证的语义
- At-most-once:出现故障的时候,啥也不做
- At-least-once:保证每条数据均至少被处理一次
- Exactly-once:最严格的处理语义
二、Exactly-Once 和Checkpoint
状态快照与恢复
制作快照的时间点
Chandy-Lamport算法
三、端到端Exactly-Once实现
端到端Exactly-once语义
两阶段提交协议
预提交阶段:
- 协作者向所有参与者发送一个commit消息
- 每个参与的协作者收到消息后,执行事务,但是不真正提交
- 若事务成功执行完成,发送一个成功的消息;执行失败,则发送一个失败的消息 提交阶段:
- 协作者向所有参与者发送一个commit消息
- 每个收到commit消息的参与者释放执行事务所需的资源,并结束这次事务的执行
- 完成步骤2后,参与者发送一个ack消息给协作者
- 协作者收到所有参与者的ack消息后,标识该事物执行完成
四、Flink案例讲解
账单计算服务
五、总结
- 数据流可以转换成动态表,动态表也能重新转换成数据流
- 处理无限数据流的算子可以是有状态的
- Flink通过Checkpoint机制实现故障前后的状态快照制作和恢复
- 支持两阶段提交协议的下游存储可以结合Flink Checkpoint机制实现严格意义上端到端的Exactly-Once语义实现