面试官您好,Flink 的 API 设计采用分层架构,从底层到高层依次提供不同抽象级别的编程接口,兼顾灵活性与易用性。总体可分为以下 三层:
✅ 1. Stateful Stream Processing(有状态流处理层)—— 底层 API
- 代表 API:
ProcessFunction - 特点:
- 最底层、最灵活;
- 可直接访问 事件时间、Watermark、状态(State)、定时器(Timer);
- 支持复杂事件处理(CEP)、自定义窗口逻辑等。
- 适用场景:需要精细控制时间、状态和事件处理逻辑的高级应用。
keyedStream.process(new ProcessFunction<Event, String>() {
@Override
public void processElement(Event value, Context ctx, Collector<String> out) {
// 自定义处理 + 注册定时器
}
});
✅ 2. DataStream API / DataSet API —— 核心中层 API
⚠️ 注意:DataSet API 在 Flink 1.12+ 已被弃用,推荐统一使用 DataStream API 实现流批一体。
- 代表 API:
DataStream(流) / (旧版DataSet) - 特点:
- 提供丰富的算子:
map、filter、keyBy、window、join等; - 支持 事件时间、窗口、状态管理;
- 同一套 API 可处理 有界流(批)和无界流(实时)。
- 提供丰富的算子:
- 适用场景:绝大多数流处理和批处理任务。
stream.keyBy("userId")
.window(TumblingEventTimeWindows.of(Time.minutes(5)))
.sum("value");
✅ 3. Table API & SQL —— 高层声明式 API
- 代表 API:
Table API(链式调用) + Flink SQL - 特点:
- 声明式编程,类似关系型数据库;
- 自动优化执行计划(基于 Apache Calcite);
- 完全流批统一:同一段 SQL 可运行在流或批模式下;
- 支持窗口、聚合、Join、UDF 等。
- 适用场景:数据分析、实时数仓、BI 报表等快速开发场景。
-- Flink SQL 示例
SELECT user_id, COUNT(*)
FROM clicks
GROUP BY user_id, TUMBLE(ts, INTERVAL '1' MINUTE);
📊 三层 API 对比总结
| 层级 | API 类型 | 抽象程度 | 灵活性 | 开发效率 | 典型用途 |
|---|---|---|---|---|---|
| 底层 | ProcessFunction | 低 | ⭐⭐⭐⭐⭐ | 低 | 复杂事件处理、自定义逻辑 |
| 中层 | DataStream API | 中 | ⭐⭐⭐⭐ | 中 | 主流实时计算、ETL |
| 高层 | Table API / SQL | 高 | ⭐⭐ | ⭐⭐⭐⭐⭐ | 实时数仓、分析查询 |
✅ 补充:统一运行时
无论使用哪一层 API,最终都会被编译成 JobGraph,在 统一的流式运行时引擎 上执行,保证一致的容错、状态管理和性能。
✅ 总结一句话:
Flink API 分为三层:底层 ProcessFunction 提供最大灵活性,中层 DataStream API 是主流开发选择,高层 Table API/SQL 实现流批统一的声明式分析——开发者可根据需求“按需取用,层层递进”。
谢谢!
1万+

被折叠的 条评论
为什么被折叠?



