Flink Exactly Once 语义| 青训营笔记

77 阅读3分钟

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

课堂笔记

一、本堂课重点内容:

  • 数据流和动态表
  • checkpoint与Exactly-Once
  • 端到端Exactly-Once

二、详细知识点介绍:

1.数据流与动态表的具体转化流程

在mysql等数据库中表是静态的。而在Flink SQL中由于数据流源源不断的进入,因此表是实时更新的,我们把这样的表叫做动态表。其具体转化流程如下:

M(@(LY_$BQ85D]R~J9SR7.png

从上可以看到数据流先转换为动态表,动态表接收连续的查询会转换为新的动态表,而动态表也可以转为新的流。

2.Retact消息的介绍

当动态表中某条消息的某个字段数据因新来的流数据需要变化时,是直接update还是怎么样呢?

  • 首先并不是直接update,而是会有一个retract的操作,即把字段数据先删除;然后接着再insert一条更新后的数据。

3.三种不同的数据处理语义

  • At-most-once:即一条数据最多发送一次,保证数据不重复,但不保证不丢失。
  • At-least-once:即一条数据最少发送一次,保证数据不丢失,但不保证不重复。
  • Exactly-once:每条数据被精确消费一次,是最严格的数据处理语义

4.checkpoint分布式一致性快照

为保证集群宕机之后数据处理不丢失,会对每个算子状态进行快照保存,因此宕机重启之后就能拿到之前的状态接着计算。checkpoint机制是Flink内部精确一次性的保证。

  • 一个简单的算法实现是先暂停数据流再等待计算并保存状态,之后再打开数据流。显然这种stop the work的算法延迟太高,不适合流式计算低延迟的要求。
  • Flink采用的是基于Chandy-Lamport的分布式一致性快照算法。source算子接收到JobManager的Barrier标志快照的开始,source保存完状态之后会接着往下传送Barrier,等到sink算子接收到Barrier保存完状态后,sink算子向JobManager发送通知标志一次chekpoint进行完。

5.严格端到端Exactly-Once具体实现

checkpoint能保证每条数据都对各个有状态的算子更新一次,sink输出算子仍然可能下发重复的数据。严格的Exactly-Once需要特殊sink算子的支持。具体实现为两提交阶段:

  • 首先开启一个事物,sink写数据操作均在这个事物里进行
  • 预提交阶段:JobManager下发barrier后,等待所有算子保存状态后成功后就向JobManager发送成功checkpoint的消息。
  • 正式提交阶段:JobManager接收到成功消息后向sink算子发送可以提交事物的消息,sink正式提交事物。若JobManager收到失败消息,sink就会回滚事物。

三、课后个人总结:

通过本次课了解了Flink容错机制,以及数据精确一致性消费底层原理。