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

80 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第3天

今天我们学习了# Exactly Once 语义在 Flink 中的实现,主要内容为以下四个部分:

  1. 数据流和动态表
  2. Exactly-Once 和 Checkpoint
  3. 端到端 Exactly-Once 实现
  4. Flink 案例讲解

数据流和动态表

传统SQL和流处理

image.png

数据流和动态表的转换

image.png

实时流查询特点:

  • 查询从不终止
  • 查询结果会不断更新,并且会产生一个新的动态表
  • 结果的动态表也可转换成输出的实时流

动态表到实时流的转换

image.png

  • Append-only Stream: Append-only 流(只有 INSERT 消息)
  • Retract Stream: Retract 流(同时包含 INSERT 消息和 DELETE 消息)

Exactly-Once 和 Checkpoint

不同数据处理保证的语义

image.png

Checkpoint

  • Checkpoint barrier 的下发
制作快照的时间点

image.png

快照制作的开始

每一个source算子接收到JM发送的CheckPoint Barrier标识状态快照制作的开始

image.png

Barrier Alignment

image.png

快照制作和数据处理的解耦

image.png

CheckPoint 的结束

所有算子都告知JM状态完成后,整个CheckPoint就结束了

image.png

端到端 Exactly-Once 实现

端到端 Exactly-Once的语义

image.png

两阶段提交协议(2PC)

image.png

Coordinator:协作者,同步和协调所有节点处理逻辑的中心节点
Participant:参与者,被中心节点调度的其他执行处理逻辑的业务节点

两阶段提交协议在 Flink 中的应用

Flink 中协作者和参与者的角色分配

image.png

协作者(JobManager)发起阶段一提交

image.png

各算子 Checkpoint 的制作

image.png

提交阶段及 Checkpoint 的制作完成

image.png

Flink案例

image.png

image.png

image.png

个人总结

通过本节课,我知道了数据流和动态表可以相互转换,并且了解了处理无限流数据的算子是可以有状态的,Flink可以通过CheckPoint机制实现故障前后状态的快照制作和恢复。