这是我参与「第四届青训营 」笔记创作活动的第1天
数据流与动态表
Flink处理的对象:实时数据流
流处理的特点
- 流是一个无限元组序列
- 执行查询无法访问所有的数据
- 查询不断更新结果,永不终止
数据流与动态表的转换:
stream -> dynamic table -> continuous query -> dynamic table -> stream
- 动态表是随时间变化的
- 连续查询:查询从不终止;查询结果会不断更新,产生新的动态表;查询可能会有状态,用来更新查询结果
- Append-only Stream: 只有 INSERT 消息
- Retract Stream: 回撤(有 INSERT 消息和 DELETE 消息)
不同数据处理保证的语义:
- at-most-once:出现故障时啥也不做。时延低
- at-least-once:保证每条语句至少被处理一次,一条数据可能会被重复消费
- exactly-once:最严格的处理语义,每条数据均被消费且仅消费一次,仿佛没有故障
Exactly-once 与 checkpoint
状态快照与恢复
状态恢复的时间点:需要等待所有处理逻辑消费完成 source 保留状态及之前的数据
checkpoint对作业性能的影响
- 解耦了快照制作和数据处理,各个算子制作完成状态快照后就可以正常处理数据,不用等下游算子
- 在快照制作和 barrier alignment 过程中需要暂停处理数据
- 快照保存远端可能比较耗时
Flink 端到端 Exactly-Once 语义
两阶段提交协议:2PC
- Coordinator:协作者,同步和协调所有节点处理逻辑的中心节点
- Participant:参与者,被coordinator调度的其他执行处理逻辑的业务节点
- 预提交阶段
- coordinator向所有participant发送commit消息;
- participant执行事务,但不提交
- 若事务执行成功,发生成功消息给coordinator;否则发送失败消息
- 提交阶段
- coordinator向所有participant发送commit(or rollback)消息
- 每个participant释放执行事务所需的资源,结束事务的执行
- 发送一个ack给coordinator
- coordinator收到所有ack后,标识事务执行完成(or 成功回滚)