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

115 阅读2分钟

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

第三节:Exactly Once 语义在 Flink 中的实现

数据流与动态表

动态表

image.png

    在任意时刻都可以将动态表视作SQL的静态表进行查询

连续查询的对比

image.png

1. INSERT + UPDATE
2. INSERT

Retract 【回撤】消息

image.png

    Count + 1 = delete 1; insert 2

状态 —— 有状态的算子

需要存储每一个先前用户的url(但不显示在输出中),在新数据输入时与先前存储的数据进行对比,以便增加次数/接入新表

image.png

Exactly-Once 和 Checkpoint

一致性保证语义

  • At-most-once:每条数据消费至多一次,处理延迟低
  • At-least-once:每条数据消费至少一次,一条数据可能存在重复消费
  • Exactly-once:每条数据都被消费且仅被消费一次,仿佛故障从未发生

状态快照与恢复原理

image.png

状态快照 —— Chandy-Lamport算法

image.png

具体流程

barrier每到一个有状态的节点都会向JobManager反馈

  • Checkpoint barrier 的下发

  • 算子状态制作和 barrier 传递

   Source1/2向JobManager告知barrier已完成
  • 多个上游的等待 barrier 对齐现象

    barrier到达task,barrier进行对齐
  • Checkpoint 并不阻塞算子数据处

  • Checkpoint ACK和制作完成

Flink 端到端 Exactly-Once 实现

两阶段提交协议(2PC)

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

操作流程

  1. Coordinator向Participant发送Query to commit【预执行】指令;所有Participant预执行事务

  2. (1)所有Participant完成预执行后,向Coordinator回复Yes;Coordinator收到后,向Participant发送Commit 【执行】指令;Participant正式执行事务

    (2)若有Participant回复No,则Coordinator向Participant发送Rollback 【回滚】指令,释放预执行所占用的空间。回滚完成后,再重新进行流程1

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

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

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

  • 各算子 Checkpoint 的制作

  • 提交阶段及 Checkpoint 的制作完成

总结

image.png