Exactly Once 语义在 Flink 中的实现 | 青训营笔记

50 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第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调度的其他执行处理逻辑的业务节点

image.png

  1. 预提交阶段
    1. coordinator向所有participant发送commit消息;
    2. participant执行事务,但不提交
    3. 若事务执行成功,发生成功消息给coordinator;否则发送失败消息
  2. 提交阶段
    1. coordinator向所有participant发送commit(or rollback)消息
    2. 每个participant释放执行事务所需的资源,结束事务的执行
    3. 发送一个ack给coordinator
    4. coordinator收到所有ack后,标识事务执行完成(or 成功回滚)

Flink 中的 2PC Sink

image.png