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

95 阅读3分钟

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

课程内容及分析理解

一、课程内容

1.数据流和动态表

2.Exactly-Once和CheckPoint

二、分析理解

(一)数据流和动态表

1.传统SQL和流处理

让我们先具体说明一下我们说的流处理和SQL是什么意思。

流(事件流)

  • 流指的是像Kafka、Kinesis或Pulsar这样的消息中介,它们将数据作为事件或消息的连续流来处理。事件流处理一切,从交易到用户在网站或移动应用程序上的行动、物联网传感器数据、服务器的指标,甚至是传统数据库上的活动,都通过 change data capture.

SQL

  • 在流的背景下,SQL为用户提供了一种声明性语言,用于创建视图,将流中的原始数据连接、过滤和分组为更有用的输出(CREATE MATERIALIZED VIEW),从源和视图中选择数据(SELECT)

微信图片_20220730142356.jpg

2.数据流和动态表转换

  • 动态表是 Flink 对流数据的 Table API 和 SQL 支持的核心概念。与表示批处理数据的静态表不同,动态表是随时间变化的。动态表可以像静态的批处理表一样进行查询,查询一个动态表会产生持续查询(Continuous Query)。连续查询永远不会终止,并会生成另一个动态表。 查询(Query)会不断更新其动态结果表,以反映其动态输入表上的更改。

微信图片_20220730142248.png

在数据流上执行关系查询时,数据流与动态表的转换关系图的主要步骤如下。

  • 将数据流转换为动态表

  • 在动态表上进行连续查询,并生成新的动态表

  • 生成的动态表再转换为新的数据流

(二)Exactly-Once和CheckPoint

1.Exactly-Once

Exactly-Once的意思是精确一次,表示一条消息从其消费到后续的处理成功,只会发生一次。Flink声称实现了Exactly-Once语义,实际上在事件处理过程中,各种异常情况都有可能发生,所以根本不可能保证每条消息真的真会被处理一次。Flink的Exactly-Once真正的含义在于可以保证Flink状态的容灾和只向后端提交一次持久存储(要求后端支持事务,例如Kafka、MySQL)。那么Flink如何实现Exactly-Once呢?

  • Source支持数据重读
  • Sink支持事务。可以是类似二阶段提交,如kafka,或者Sink支持幂等,可以覆盖之前写入的数据,如redis
  • 基于Checkpoint保证状态的容灾及一致性

结合以上三点便可以实现Exactly-Once。

2.CheckPoint

Checkpoint是Flink实现容错机制最核心的功能,它会根据用户的配置周期性地对流中各个算子(Operator)的状态生成快照,持久化到外部存储。Flink程序一旦意外崩溃时,重新运行程序时可以有选择地从这些快照进行恢复,从而修正因为故障带来的程序数据异常。Flink写入到外部存储是异步的,意味着Flink在这个阶段可以继续处理数据。

参考文献:
什么是流式SQL,他有什么用? https://cloud.tencent.com/developer/article/1950913
Exactly Once 语义在Flink中的实现 https://bytedance.feishu.cn/file/boxcnFPburXr95rMNel1SHOvISg
Flink SQL实现流批一体 https://www.ngui.cc/article/show-404670.html