本文是大数据系列第 90 篇,作为 Flink 系列的起点,全面介绍 Apache Flink 的设计理念、技术特性和架构组成。
什么是 Apache Flink
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 | 存储位置 | 适用场景 |
|---|---|---|
| MemoryStateBackend | JVM Heap | 开发测试 |
| FsStateBackend | 文件系统 + Heap | 中等状态规模 |
| RocksDBStateBackend | RocksDB(本地磁盘) | 超大状态,生产推荐 |
Flink vs Spark Streaming
| 维度 | Flink | Spark Streaming |
|---|---|---|
| 处理模型 | 原生流处理 | 微批(Micro-batch) |
| 延迟 | 毫秒级 | 秒级(批次间隔) |
| 状态管理 | 原生内置 | 依赖 RDD checkpoint |
| 事件时间 | 原生支持 | 支持但复杂 |
| 批处理 | 统一 API | 独立 Spark Core API |
| 学习曲线 | 较陡 | 与 Spark 生态统一 |
适用场景
选择 Flink 的典型场景:
- 要求毫秒级端到端延迟的实时风控
- 复杂事件处理(CEP)和多流 Join
- 大规模有状态流计算(如实时推荐、实时特征)
- 需要严格 Exactly-Once 语义的金融场景
后续文章将逐步介绍 Flink DataStream API 编程、窗口操作、状态管理与 Checkpoint 配置。