本文是大数据系列第 90 篇,作为 Flink 系列的起点,全面介绍 Apache Flink 的设计理念、技术特性和架构组成。

完整图文版(含截图):CSDN 原文 | 掘金

Apache Flink 是一个开源分布式流处理框架,专为有界(批)和无界(流)数据的高性能、低延迟处理而设计。

Flink 的核心设计哲学是流批一体:批处理被视为流处理的特例(有边界的有限流),而非两套独立的计算模型。这使得同一套 API 和运行时可以处理实时流数据和离线批数据。

发展历史

时间事件
2008 年柏林工业大学 Stratosphere 研究项目启动
2014 年 4 月捐赠给 Apache 软件基金会
2014 年 12 月成为 Apache 顶级项目,正式命名 Flink(德语:灵活、敏捷)
至今阿里巴巴、Uber、Netflix 等大规模生产使用

阿里巴巴是 Flink 最重要的企业贡献者之一,其内部维护的 Blink 版本已回馈到社区主干。

核心技术特性

1. Exactly-Once 状态一致性

Flink 基于轻量级分布式快照(Chandy-Lamport 算法)实现容错,保证在节点故障时能够精确恢复到上次 Checkpoint 的状态,确保每条数据恰好被处理一次。

2. 事件时间处理

Flink 原生支持**事件时间(Event Time)**语义,通过水位线(Watermark)机制处理乱序数据,精确处理数据生成时间而非系统到达时间。

3. 分层 API 架构

SQL / Table API    ← 声明式,适合分析师
    DataStream     ← 核心流处理 API
      ProcessFunction ← 最底层,完全控制

4. 内存管理

Flink 自行管理 JVM 内存(TypedSerializer + MemorySegment),避免 GC 压力,在大数据量场景下内存效率显著优于 Spark。

5. 弹性扩展

水平扩展至数千节点,可处理 PB 级数据,延迟可达毫秒级。

处理模型:有界流 vs 无界流

无界流(Unbounded Streams):

  • 数据持续产生,无自然终点
  • 必须实时处理,7×24 小时运行
  • 典型来源:Kafka、消息队列、传感器数据

有界流(Bounded Streams):

  • 有明确的开始和结束
  • 可以等待全部数据到齐后处理
  • 等价于传统批处理,处理完成后终止

架构组件

JobManager

集群的”大脑”,负责:

  • 接收并解析作业图(JobGraph → ExecutionGraph)
  • 任务调度与资源分配
  • Checkpoint 协调与容错恢复
  • 监控 TaskManager 心跳

TaskManager

执行任务的”工人”,负责:

  • 运行分配到的 Task(SubTask)
  • 管理本地状态
  • 处理任务间的网络数据传输
  • 向 JobManager 汇报状态

Dispatcher

作业提交入口,提供 REST API 接口,将提交的作业转发给对应的 JobManager。同时运行 Flink Web UI。

ResourceManager

对接底层集群管理系统(YARN、Kubernetes、Standalone),负责计算资源(TaskSlot)的申请、分配和释放。

State Backend

状态存储抽象层,提供三种实现:

Backend存储位置适用场景
MemoryStateBackendJVM Heap开发测试
FsStateBackend文件系统 + Heap中等状态规模
RocksDBStateBackendRocksDB(本地磁盘)超大状态,生产推荐
维度FlinkSpark Streaming
处理模型原生流处理微批(Micro-batch)
延迟毫秒级秒级(批次间隔)
状态管理原生内置依赖 RDD checkpoint
事件时间原生支持支持但复杂
批处理统一 API独立 Spark Core API
学习曲线较陡与 Spark 生态统一

适用场景

选择 Flink 的典型场景:

  • 要求毫秒级端到端延迟的实时风控
  • 复杂事件处理(CEP)和多流 Join
  • 大规模有状态流计算(如实时推荐、实时特征)
  • 需要严格 Exactly-Once 语义的金融场景

后续文章将逐步介绍 Flink DataStream API 编程、窗口操作、状态管理与 Checkpoint 配置。