Flink流批一体架构
请解释Flink的流批一体(Batch-Stream Unified)架构,它是如何做到用同一套API处理有界数据和无界数据的?
回答
小字辈
Flink流批一体核心思想:
- 有界数据(Batch)= 特殊的有界流(Bounded Stream)
- 流处理是Flink的一等公民,批处理是流处理的特殊情况
- 同一套Runtime、同一套API处理批和流
架构设计:
1. 统一的Runtime(Flink Runtime):
- 所有数据都视为无限流(Unbounded Stream)
- 批处理时,数据源标记为有界(Bounded)
- Task之间通过Pipeline传输数据(流模式)
- 批模式下可开启Blocking Shuffle(类似MapReduce的中间落盘)
2. 统一的API层:
- DataStream API: 同时处理批和流
- Table API / SQL: 同一SQL语句在批和流模式下效果一致
- DataSet API(已废弃): 在Flink 1.12+中被DataStream替代
3. 核心差异(批与流自动切换): | 特性 | 流模式 | 批模式 | |------|--------|--------| | 输入 | 无界流(Unbounded)| 有界流(Bounded)| | 任务调度 | 持续运行 | 有限执行后结束 | | Shuffle | 流水线式(Pipeline)| 可选择阻塞式(Blocking)| | 状态 | 可增量Checkpoint | 全量快照 | | 水位线(Watermark)| 自动生成 | 直接设为+∞ | | Join | 基于时间窗口 | 全量Join |
4. 关键优化(批模式特有的):
- Shuffle优化: 批模式下使用Blocking Shuffle(Sort-Merge Shuffle),处理效率高于流模式
- 调度优化: 支持懒调度(Lazy Scheduling),一个Stage完成后才调度下一个
- 超大规模容错: 批模式下使用任务级容错(局部恢复)而非全局恢复
使用方式:
// 使用相同的DataStream API
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 设置批模式(Flink 1.12+)
env.setRuntimeMode(RuntimeExecutionMode.BATCH);
// 或自动检测
// env.setRuntimeMode(RuntimeExecutionMode.AUTOMATIC);