Flink中Exactly Once语义以及Check point的实现|青训营笔记
这是我参与「第四届青训营 」笔记创作活动的第3天
一、复习前一天的主要知识点
1.Apache Flink的开源生态
- 流批一体:支持流式计算和批式计算;
- OLAP:Flink 可以支持 OLAP 这种短查询场景;
- Flink ML:pyFlink、ALink、AIFlow 等生态支持 Flink 在 ML 场景的应用;
- Gelly:图计算;
- Stateful Function:支持有状态的 FAAS 场景;
- ...
2.Flink支持流批一体和OLAP
(1)支持流批一体
- 批式计算是流式计算的特例,Everything is Streams,有界数据集(批式数据)也是一种数据流、一种特殊的数据流;不管是有边界的数据集(批式数据)还是无边界数据集,Flink 都可以天然地支持,这是 Flink 支持流批一体的基础。并且 Flink 在流批一体上,从上面的 API 到底层的处理机制都是统一的,是真正意义上的流批一体。
(2)Flink做OLAP一体
- 统一引擎:流处理、批处理、OLAP 统一使用 Flink 引擎;
- 既有优势:利用 Flink 已有的很多特性,使 OLAP 使用场景更为广泛;
- 相互增强:OLAP 能享有现有引擎的优势,同时也能增强引擎能力;
详见我的上一篇笔记Flink相关原理与实践|青训营笔记
二、在Flink实现Exactly Once语义以及Checkpoint
1.简单了解Exactly Once和Checkpoint
- Application Consistency Guarantees: 作业一致性保证
- At-most-once:每条数据消费至多一次
- At-least-once:每条数据消费至少一次
- Exactly-once: 每条数据都被消费且仅被消费一次
- Checkpoint: Flink 实现各个计算逻辑状态快照算法,也可指一次状态快照
- Checkpoint barrier: 用于标识状态快照的制作,也将数据划分成不同的消费区间
- Checkpoint Alignment: 等待多个上游的Checkpoint barrier到达的现象
- JobManager: 负责协调和管理 Checkpoint
2.数据流和动态表
动态表:随时间不断变化的表,在任意时刻,可以像查询静态批处理表一样查询它们
实时流的查询特点: 查询不终止,查询会不断更新 并产生一个新的动态表,这张表也可以转化成输出的实时流
动态表转化实时流
- Append-only Stream: Append-only 流(只有 INSERT 消息)
- Retract Stream: Retract 流(同时包含 INSERT 消息和 DELETE 消息)
- Upsert Stream:: Upsert 流(同时包含 UPSERT 消息和 DELETE 消息)
数据流到动态表转换关系图
3.Exactly Once和Checkpoint
(1)一致性保证语义
- At-most-once:每条数据消费至多一次,处理延迟低
- At-least-once:每条数据消费至少一次,一条数据可能存在重复消费
- Exactly-once:每条数据都被消费且仅被消费一次,仿佛故障从未发生
(2)Checkpoint
- Checkpoint barrier 的下发
- 算子状态制作和 barrier 传递
- 多个上游的等待 barrier 对齐现象
- Checkpoint 并不阻塞算子数据处
- Checkpoint ACK和制作完成
checkpoint是flink用于持久化flink状态的机制
flink会定时将flink计算的状态持久化到hdfs中
开启checkpint的方法
// 每 1000ms 开始一次 checkpoint
env.enableCheckpointing(1000)
// 高级选项:
// 设置模式为精确一次 (这是默认值)
env.getCheckpointConfig.setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE)
// 确认 checkpoints 之间的时间会进行 500 ms
env.getCheckpointConfig.setMinPauseBetweenCheckpoints(500)
// Checkpoint 必须在一分钟内完成,否则就会被抛弃
env.getCheckpointConfig.setCheckpointTimeout(60000)
// 允许两个连续的 checkpoint 错误
env.getCheckpointConfig.setTolerableCheckpointFailureNumber(2)
// 同一时间只允许一个 checkpoint 进行
env.getCheckpointConfig.setMaxConcurrentCheckpoints(1)
// 使用 externalized checkpoints,这样 checkpoint 在作业取消后仍就会被保留
//RETAIN_ON_CANCELLATION: 当任务取消时保留checkpoint
env.getCheckpointConfig.setExternalizedCheckpointCleanup(
ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION)
//指定状态后端
//EmbeddedRocksDBStateBackend eocksDb状态后端
env.setStateBackend(new EmbeddedRocksDBStateBackend(true))
//将状态保存到hdfs中,在触发checkpoint的时候将状态持久化到hdfs中
env.getCheckpointConfig.setCheckpointStorage("hdfs://master:9000/flink/checkpoint")
从Checkpoint恢复任务
//可以在网页中指定checkpint的路径恢复,路径需要带上前缀hdfs://master:9000
hdfs://master:9000/flink/checkpoint/11edbec21742ceddebbb90f3e49f24b4/chk-35
//也可以在命令行中重新提交任务,指定恢复任务的位置, 需要先上传jarr包
# -s 恢复任务的位置
flink run -t yarn-session -Dyarn.application.id=application_1658546198162_0005 -c com.shujia.flink.core.Demo15RocksDB -s hdfs://master:9000/flink/checkpoint/11edbec21742ceddebbb90f3e49f24b4/chk-35 flink-1.0.jar
(3)端到端 Exactly-Once 实现
- 两阶段提交协议(2PC)
- oordinator:协作者,同步和协调所有节点处理逻辑的中心节点
- Participant:参与者,被中心节点调度的其他执行处理逻辑的业务节点
两阶段提交协议在Flink中的应用 - Flink 中协作者和参与者的角色分配
- 协作者(JobManager)发起阶段一提交
- 各算子 Checkpoint 的制作
- 提交阶段及 Checkpoint 的制作完成
三、总结
在这节课上主要认识了Flink中Checkpoint和Exactly Once语义的是怎样实现的,也了解了两阶段提交协议的过程,以及参与者和协调者是如何变更状态的。主要还是需要理解,这些协议语义是如何作用于Flink中。
推荐文章
两阶段协议
参考文章:
青训营学员手册
Checkpoint
个人笔记
ps:笔记记的很早发布的较晚