Flink Barrier 对齐和非对齐(Unaligned Checkpoint)的区别?
Apache Flink 的 Checkpoint 机制基于 Chandy-Lamport 算法,通过在数据流中注入 Barrier(屏障) 来切分数据流,从而实现状态的一致性快照。
Barrier 对齐(Aligned) 和 非对齐(Unaligned) 的核心区别在于:当算子有多个输入通道(Input Channel)时,如何处理到达时间不一致的 Barrier,以及是否需要暂停处理数据。
以下是详细的对比解析:
1. Barrier 对齐 (Aligned Checkpoint)
这是 Flink 最经典、默认的 Checkpoint 模式(在 Flink 1.11 之前是唯一模式)。
工作机制
假设一个算子有两个输入通道 A 和 B:
- 等待: 当通道 A 的 Barrier 先到达时,算子会停止处理通道 A 的后续数据(将其缓存起来),因为这部分数据属于下一个 Checkpoint。
- 对齐: 算子继续处理通道 B 的数据,直到通道 B 的 Barrier 也到达。
- 快照: 当所有通道的 Barrier 都到齐后,算子进行状态快照(Snapshot),并将 Barrier 向下游发送。
- 恢复: 释放通道 A 的阻塞,继续处理所有通道的数据。
特点
- 状态内容: Checkpoint 文件中只包含算子的状态(State),不包含“在路上”的数据(In-flight Data)。
- Exactly-Once: 严格保证精确一次语义。
缺点:背压(Backpressure)问题
如果系统存在严重的背压(某个通道处理非常慢),Barrier 会迟迟无法到达。
- Checkpoint 超时: 等待对齐的时间过长,导致 Checkpoint 失败。
- 加剧背压: 因为先收到 Barrier 的快通道会被阻塞(Stop-the-world),导致整个作业的处理性能进一步下降。
2. Barrier 非对齐 (Unaligned Checkpoint)
为了解决背压导致 Checkpoint 失败的问题,Flink 1.11 引入了非对齐检查点。
工作机制
同样假设算子有两个输入通道 A 和 B:
- 不等待: 当通道 A 的 Barrier 到达时,算子不等待通道 B 的 Barrier,也不阻塞通道 A。
- 立即快照: 算子立刻触发 Checkpoint。
- 保存额外数据: 此时,Checkpoint 不仅保存算子状态,还会把所有输入/输出缓冲区(Buffer)中积压的数据(即 Barrier 之前的数据)全部写入 Checkpoint 文件中。
- 转发: Barrier 越过算子,立刻发往下游。
特点
- 状态内容: Checkpoint 文件包含 算子状态 + 输入/输出缓冲区里的数据(In-flight Data)。
- 穿透性: Barrier 像子弹一样快速穿过整个数据流,不受背压影响。
缺点
- IO 压力大: 因为要持久化大量的 Buffer 数据,Checkpoint 的文件体积会变大,网络和磁盘 IO 开销增加。
- 恢复稍慢: 故障恢复时,不仅要恢复状态,还要回放 Buffer 中的数据。
3. 核心区别对比表
| 特性 | Barrier 对齐 (Aligned) | Barrier 非对齐 (Unaligned) |
|---|---|---|
| 处理逻辑 | 等待所有 Barrier 到齐,期间阻塞快通道 | 只要收到第一个 Barrier 就快照,不阻塞 |
| Checkpoint 大小 | 小 (仅包含 State) | 大 (包含 State + In-flight Buffer Data) |
| Checkpoint 耗时 | 受数据处理速度影响,背压下极慢 | 极快,几乎不受背压影响 |
| 对吞吐量的影响 | 对齐期间会暂停处理,影响吞吐 | 不暂停处理,但高频 IO 可能抢占 CPU/带宽 |
| 适用场景 | 正常流量,无严重背压,状态较大但 Buffer 小 | 严重背压场景,作业容易因超时失败 |
| 恢复速度 | 快 | 相对较慢 (需回放 Buffer 数据) |
| 语义 | Exactly-Once | Exactly-Once (实现方式不同) |
4. 形象比喻
假设有两条传送带(Channel A 和 B)都在运送货物(数据)到一个打包站(算子),货物中间插了一面红旗(Barrier)。
对齐模式(Aligned):
A 的红旗先到了,打包工人把 A 停掉,让 A 的货物在传送带上等着。工人专门处理 B 的货物,直到 B 的红旗也到了。然后工人拍一张照片(Checkpoint),再重新开启 A 和 B。- 问题: 如果 B 堵住了,A 也得陪着等,整个工厂效率降低。
非对齐模式(Unaligned):
A 的红旗一到,工人立刻拍照。但是,因为 B 的红旗还没到,B 传送带上红旗前面的那些货物还没处理。为了保证照片(快照)完整,工人把 B 传送带上目前积压的所有货物都搬下来,存到仓库(Checkpoint Storage)里去。- 问题: 仓库里存的东西变多了(文件变大),搬运这些积压货物比较累(IO 消耗大)。
5. 最佳实践建议
- 默认选择: 通常情况下,使用默认的 Aligned Checkpoint 即可。
- 何时开启 Unaligned:
- 当你的作业经常因为背压导致 Checkpoint 超时失败。
- 当 Checkpoint 完成时间(Duration)波动极大。
- 注意事项:
- 如果瓶颈在于状态后端存储(如 HDFS/S3)的 IO 带宽,开启 Unaligned 可能会适得其反(因为文件变大了)。
- Unaligned Checkpoint 需要配合 Flink 的新版 Source 接口和内存管理机制才能发挥最大效用。
在 Flink 1.15+ 中,可以配置为 aligned.checkpoint.timeout。即:先尝试对齐,如果超过指定时间还没对齐,自动切换为非对齐模式。这是一种折中的智能策略。