这是我参与「第四届青训营 」笔记创作活动的第3天。
课程内容及分析理解
一、课程内容
1.数据流和动态表
2.Exactly-Once和CheckPoint
二、分析理解
(一)数据流和动态表
1.传统SQL和流处理
让我们先具体说明一下我们说的流处理和SQL是什么意思。
流(事件流)
- 流指的是像Kafka、Kinesis或Pulsar这样的消息中介,它们将数据作为事件或消息的连续流来处理。事件流处理一切,从交易到用户在网站或移动应用程序上的行动、物联网传感器数据、服务器的指标,甚至是传统数据库上的活动,都通过 change data capture.
SQL
- 在流的背景下,SQL为用户提供了一种声明性语言,用于创建视图,将流中的原始数据连接、过滤和分组为更有用的输出(CREATE MATERIALIZED VIEW),从源和视图中选择数据(SELECT)
2.数据流和动态表转换
- 动态表是 Flink 对流数据的 Table API 和 SQL 支持的核心概念。与表示批处理数据的静态表不同,动态表是随时间变化的。动态表可以像静态的批处理表一样进行查询,查询一个动态表会产生持续查询(Continuous Query)。连续查询永远不会终止,并会生成另一个动态表。 查询(Query)会不断更新其动态结果表,以反映其动态输入表上的更改。
在数据流上执行关系查询时,数据流与动态表的转换关系图的主要步骤如下。
-
将数据流转换为动态表。
-
在动态表上进行连续查询,并生成新的动态表。
-
生成的动态表再转换为新的数据流。
(二)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