Apache Flink 是一个分布式流处理框架,擅长处理有状态的实时计算。与 Spark Streaming 的微批处理模式不同,Flink 是真正的流式处理引擎,事件到达即处理,延迟可以低至毫秒级。
为什么选择 Flink?
在实时数据处理场景中,我们经常面临以下挑战:
- 低延迟要求:风控系统需要在 100ms 内判断一笔交易是否异常
- 精确一次语义:金融场景下不能多算也不能漏算
- 状态管理:需要维护窗口聚合、去重等状态
- 事件时间处理:处理乱序事件和迟到数据
核心概念
DataStream API
Flink 最核心的 API 是 DataStream,它将数据流抽象为有状态的变换操作:
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<String> text = env.socketTextStream("localhost", 9999);
DataStream<Tuple2<String, Integer>> counts = text
.flatMap(new Tokenizer())
.keyBy(value -> value.f0)
.sum(1);
counts.print();
env.execute("WordCount");
时间语义
Flink 支持三种时间语义:处理时间(Processing Time)、事件时间(Event Time)和注入时间(Ingestion Time)。对于大多数业务场景,我们使用事件时间,通过 Watermark 机制处理乱序数据。
窗口机制
Flink 提供了丰富的窗口类型:
- 滚动窗口:固定大小,不重叠
- 滑动窗口:固定大小,可重叠
- 会话窗口:根据活跃度动态划分
- 全局窗口:自定义触发器
实践建议
在实际项目中,以下几点经验值得注意:
- 合理设置 Checkpoint 间隔,通常 30s-1min
- 使用 RocksDB 作为状态后端处理大状态
- Watermark 延迟要结合业务场景设置
- 注意反压问题,及时监控
Flink 的学习曲线比 Spark 稍陡,但在低延迟、有状态的流处理场景中,它几乎是最佳选择。