← 返回首页

Flink实时计算入门

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 稍陡,但在低延迟、有状态的流处理场景中,它几乎是最佳选择。