Flink 底层原理系列(一):架构概述
2021-01-03·6 分钟阅读
前言
Apache Flink 是一个分布式流处理引擎,以其出色的状态管理、精确一次语义和低延迟高吞吐能力著称。理解 Flink 的底层原理,对于构建高性能、高可用的实时数据处理系统至关重要。
本系列将从底层实现角度深入解析 Flink 的核心机制。
技术亮点
| 技术点 | 难度 | 面试价值 | 本文覆盖 |
|---|---|---|---|
| 流批统一架构 | ⭐⭐⭐ | 高频考点 | ✅ |
| Flink 核心组件 | ⭐⭐⭐ | 高频考点 | ✅ |
| 有界流与无界流 | ⭐⭐ | 基础考点 | ✅ |
| Flink vs Spark | ⭐⭐⭐ | 常见问题 | ✅ |
面试考点
- Flink 的核心特点是什么?为什么选择 Flink?
- Flink 的架构由哪些组件组成?
- Flink 和 Spark Streaming 有什么区别?
- 什么是有界流和无界流?
Flink 核心定位
流批统一
┌─────────────────────────────────────────────────────────────────────────┐
│ Flink 流批统一架构 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 传统架构(两套系统): │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 批处理(离线) 流处理(实时) │ │
│ │ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Hadoop/Spark│ │ Storm/Flink│ │ │
│ │ │ MapReduce │ │ Streaming │ │ │
│ │ └─────────────┘ └─────────────┘ │ │
│ │ │ │ │ │
│ │ ▼ ▼ │ │
│ │ 两套代码、两套维护、数据不一致风险 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ Flink 解决方案 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Apache Flink │ │
│ │ ┌───────────────┐ │ │
│ │ │ 统一 API 层 │ │ │
│ │ │ DataStream │ │ │
│ │ │ Table/SQL │ │ │
│ │ └───────┬───────┘ │ │
│ │ │ │ │
│ │ ┌───────▼───────┐ │ │
│ │ │ 流处理引擎 │ │ │
│ │ │ Runtime │ │ │
│ │ └───────┬───────┘ │ │
│ │ │ │ │
│ │ ┌───────────────┴───────────────┐ │ │
│ │ ▼ ▼ │ │
│ │ ┌───────────┐ ┌───────────┐ │ │
│ │ │ 无界流处理 │ │ 有界流处理 │ │ │
│ │ │ (流处理) │ │ (批处理) │ │ │
│ │ └───────────┘ └───────────┘ │ │
│ │ │ │
│ │ 一套代码、统一语义、流批一体 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
核心特性
┌─────────────────────────────────────────────────────────────────────────┐
│ Flink 核心特性 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 精确一次语义(Exactly-Once) │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 通过 Checkpoint + 状态管理实现: │ │
│ │ • 状态一致性保证 │ │
│ │ • 端到端精确一次(配合 Kafka 等支持事务的外部系统) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 2. 高吞吐、低延迟 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ • 毫秒级延迟 │ │
│ │ • 每秒处理数百万事件 │ │
│ │ • 高效的网络传输机制 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 3. 强大的状态管理 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ • Keyed State & Operator State │ │
│ │ • 多种 State Backend(Heap、RocksDB) │ │
│ │ • 增量 Checkpoint │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 4. 事件时间处理 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ • Event Time 语义 │ │
│ │ • Watermark 机制 │ │
│ │ • 乱序数据处理 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 5. 容错能力 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ • 自动故障恢复 │ │
│ │ • Checkpoint & Savepoint │ │
│ │ • 细粒度恢复 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
Flink 架构组件
整体架构
┌─────────────────────────────────────────────────────────────────────────┐
│ Flink 集群架构 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Client │ │
│ │ (提交作业/查看结果) │ │
│ │ │ │
│ └───────────────────────────────┬─────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ JobManager │ │
│ │ ┌────────────────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │
│ │ │ │ Dispatcher │ │ResourceMgr │ │ JobMaster │ │ │ │
│ │ │ │ (分发器) │ │ (资源管理) │ │ (作业管理) │ │ │ │
│ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ │
│ │ │ │ │ │
│ │ └────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └───────────────────────────────┬─────────────────────────────────┘ │
│ │ │
│ ┌───────────────────┼───────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
│ │ TaskManager 1 │ │ TaskManager 2 │ │ TaskManager N │ │
│ │ ┌───────────┐ │ │ ┌───────────┐ │ │ ┌───────────┐ │ │
│ │ │ Slot 1 │ │ │ │ Slot 1 │ │ │ │ Slot 1 │ │ │
│ │ ├───────────┤ │ │ ├───────────┤ │ │ ├───────────┤ │ │
│ │ │ Slot 2 │ │ │ │ Slot 2 │ │ │ │ Slot 2 │ │ │
│ │ ├───────────┤ │ │ ├───────────┤ │ │ ├───────────┤ │ │
│ │ │ Slot 3 │ │ │ │ Slot 3 │ │ │ │ Slot 3 │ │ │
│ │ └───────────┘ │ │ └───────────┘ │ │ └───────────┘ │ │
│ │ │ │ │ │ │ │
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
JobManager 详解
┌─────────────────────────────────────────────────────────────────────────┐
│ JobManager 组件 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Dispatcher(分发器) │ │
│ │ ┌───────────────────────────────────────────────────────────┐ │ │
│ │ │ • 接收作业提交 │ │ │
│ │ │ • 启动 JobMaster 管理作业 │ │ │
│ │ │ • 提供 REST API │ │ │
│ │ │ • 跨作业协调 │ │ │
│ │ └───────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ResourceManager(资源管理器) │ │
│ │ ┌───────────────────────────────────────────────────────────┐ │ │
│ │ │ • 管理集群资源(TaskManager、Slot) │ │ │
│ │ │ • 响应资源请求 │ │ │
│ │ │ • 支持多种资源管理器(YARN、K8s、Standalone) │ │ │
│ │ │ • 资源分配与回收 │ │ │
│ │ └───────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ JobMaster(作业管理器) │ │
│ │ ┌───────────────────────────────────────────────────────────┐ │ │
│ │ │ • 管理单个作业的生命周期 │ │ │
│ │ │ • 协调 Checkpoint │ │ │
│ │ │ • 任务调度与故障恢复 │ │ │
│ │ │ • 维护 ExecutionGraph │ │ │
│ │ └───────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 注意:一个 Flink 集群可以有多个 JobMaster,每个管理一个作业 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
TaskManager 详解
┌─────────────────────────────────────────────────────────────────────────┐
│ TaskManager 组件 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ TaskManager(也称为 Worker)负责执行任务和处理数据交换 │
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 核心职责: │ │
│ │ ┌───────────────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ 1. 任务执行 │ │ │
│ │ │ • 执行分配给它的 Task │ │ │
│ │ │ • 管理任务的生命周期 │ │ │
│ │ │ │ │ │
│ │ │ 2. 数据交换 │ │ │
│ │ │ • 与其他 TaskManager 交换数据 │ │ │
│ │ │ • 管理输入/输出缓冲区 │ │ │
│ │ │ │ │ │
│ │ │ 3. 状态管理 │ │ │
│ │ │ • 维护本地状态 │ │ │
│ │ │ • 参与 Checkpoint │ │ │
│ │ │ │ │ │
│ │ │ 4. 资源管理 │ │ │
│ │ │ • 管理 Task Slot │ │ │
│ │ │ • 向 ResourceManager 注册 │ │ │
│ │ │ │ │ │
│ │ └───────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ Task Slot 示例: │ │
│ │ ┌───────────────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ TaskManager (3 Slots) │ │ │
│ │ │ ┌─────────────┬─────────────┬─────────────┐ │ │ │
│ │ │ │ Slot 1 │ Slot 2 │ Slot 3 │ │ │ │
│ │ │ │ ┌─────────┐ │ ┌─────────┐ │ ┌─────────┐ │ │ │ │
│ │ │ │ │ Task A │ │ │ Task B │ │ │ Task C │ │ │ │ │
│ │ │ │ │ Task A' │ │ │ Task B' │ │ │ Task C' │ │ │ │ │
│ │ │ │ └─────────┘ │ └─────────┘ │ └─────────┘ │ │ │ │
│ │ │ └─────────────┴─────────────┴─────────────┘ │ │ │
│ │ │ │ │ │
│ │ │ Slot 是资源隔离的基本单位 │ │ │
│ │ │ 一个 Slot 可以执行多个 Operator Chain │ │ │
│ │ │ │ │ │
│ │ └───────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
有界流与无界流
数据流分类
┌─────────────────────────────────────────────────────────────────────────┐
│ 有界流与无界流 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 无界流(Unbounded Stream): │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 特点: │ │
│ │ • 数据持续产生,没有结束 │ │
│ │ • 需要持续处理 │ │
│ │ • 典型场景:Kafka 消息、传感器数据、日志流 │ │
│ │ │ │
│ │ ────────────────────────────────────────────────► │ │
│ │ 1 2 3 4 5 6 7 8 9 10 ... (无限继续) │ │
│ │ │ │
│ │ 处理模式:流式处理 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 有界流(Bounded Stream): │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 特点: │ │
│ │ • 数据有明确的开始和结束 │ │
│ │ • 可以在处理完成后释放资源 │ │
│ │ • 典型场景:文件、数据库表、静态数据集 │ │
│ │ │ │
│ │ ──────────────────────────────────────────────────| │ │
│ │ 1 2 3 4 5 6 7 8 9 10 [结束] │ │
│ │ │ │
│ │ 处理模式:批处理(流处理的特例) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ Flink 的观点:批处理是流处理的特例 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 批处理 = 有界流处理 │ │
│ │ • 使用相同的 API(DataStream) │ │
│ │ • 使用相同的运行时引擎 │ │
│ │ • 批处理可以享受流处理的优化 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
Flink vs Spark Streaming
对比分析
┌─────────────────────────────────────────────────────────────────────────┐
│ Flink vs Spark Streaming │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 对比项 Flink Spark Streaming │ │
│ │ ────────────────────────────────────────────────────────────── │ │
│ │ 处理模型 事件驱动 微批处理(Micro-batch) │ │
│ │ 延迟 毫秒级 秒级(由批次大小决定) │ │
│ │ 吞吐量 高 高 │ │
│ │ 时间语义 Event Time 优先 Processing Time 优先 │ │
│ │ 状态管理 强大(内置) 需要手动管理 │ │
│ │ 容错机制 Checkpoint Checkpoint(DStream) │ │
│ │ 精确一次 支持(端到端) 支持(有限) │ │
│ │ 流批统一 原生支持 需要两套 API(后改进) │ │
│ │ 窗口机制 丰富(滚动/滑动/会话)有限 │ │
│ │ 生态系统 起步晚,快速增长 成熟 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 架构对比: │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Spark Streaming (Micro-batch): │ │
│ │ ┌───────────────────────────────────────────────────────────┐ │ │
│ │ │ 数据流 ──► 切分批次 ──► 批处理 ──► 结果 │ │ │
│ │ │ (DStream) (RDD) │ │ │
│ │ │ │ │ │
│ │ │ 延迟:取决于批次间隔(通常 500ms - 数秒) │ │ │
│ │ └───────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ Flink (Event-driven): │ │
│ │ ┌───────────────────────────────────────────────────────────┐ │ │
│ │ │ 数据流 ──► 逐事件处理 ──► 结果 │ │ │
│ │ │ │ │ │
│ │ │ 延迟:毫秒级 │ │ │
│ │ └───────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 选择建议: │
│ • 需要低延迟、复杂状态管理:选择 Flink │
│ • 已有 Spark 生态、批处理为主:选择 Spark Streaming │
│ • 需要端到端精确一次:Flink 更有优势 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
典型应用场景
┌─────────────────────────────────────────────────────────────────────────┐
│ Flink 典型应用场景 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 实时 ETL │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Kafka ──► Flink(数据清洗/转换) ──► Kafka/HBase/ES │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 2. 实时数据分析 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 用户行为 ──► Flink(实时聚合) ──► 指标系统/大屏 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 3. 实时监控告警 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 日志/指标 ──► Flink(模式匹配/异常检测) ──► 告警系统 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 4. 实时推荐 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 用户行为 ──► Flink(特征提取) ──► 推荐系统 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 5. 金融风控 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 交易流 ──► Flink(实时规则引擎) ──► 风控决策 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
总结
本章介绍了 Flink 的整体架构和核心概念:
| 组件 | 职责 |
|---|---|
| JobManager | 作业调度、资源协调、Checkpoint 协调 |
| TaskManager | 任务执行、数据交换、状态管理 |
| Client | 作业提交、结果查询 |
核心特性:流批统一、精确一次、强大状态管理、事件时间处理、毫秒级延迟。
参考资料
下一章预告
下一章将深入解析 运行时架构,包括:
- Task Slot 与 Slot Sharing
- 作业调度机制
- 执行图层级(StreamGraph → JobGraph → ExecutionGraph)