Flink 架构概述
Apache Flink 是一个分布式流处理框架 ,支持 有状态(Stateful)计算 ,能够处理流式(Streaming)和批量(Batch)数据 。Flink 采用主从架构 ,由 JobManager 和 TaskManager 共同协作完成任务调度和计算。
1. Flink 主要组件
Flink 的核心架构主要由以下组件组成:
- Client(客户端)
- 提交 Flink 任务 到集群
- 解析用户代码并生成 JobGraph ,提交给 JobManager
- JobManager(主节点)
- 负责任务的 调度、资源分配、故障恢复
- 主要由 Dispatcher、ResourceManager、JobMaster 组成
- TaskManager(工作节点)
- 负责具体的 任务执行
- 运行 TaskSlot ,并处理 数据流、状态管理
- Storage(存储)
- 任务的**检查点(Checkpoint)和保存点(Savepoint)**存储在 HDFS、S3、RocksDB 等外部存储中
- 任务的输入和输出数据存储在 Kafka、HDFS、MySQL、Elasticsearch 等
2. Flink 集群架构
Flink 采用 Master-Slave(主从)架构 ,主要包含 JobManager (主节点) 和 TaskManager(从节点)。
(1)Master 节点(JobManager)
JobManager 负责任务管理和调度,主要组件:
- Dispatcher(调度器) :
- 负责接收 Client 提交的任务
- 提供 REST API 接口,允许用户查询任务状态
- ResourceManager(资源管理器) :
- 负责管理 Flink 计算资源
- 与 YARN / Kubernetes / Mesos 协作,动态分配 TaskManager
- JobMaster(作业管理器) :
- 负责管理 Flink 任务的执行
- 维护 ExecutionGraph(执行图)
- 处理 故障恢复
(2)Worker 节点(TaskManager)
TaskManager 负责执行具体任务,包含:
- TaskSlot(任务槽) :
- 任务的最小资源单位,每个 TaskManager 有多个 TaskSlot
- Slot 之间内存相互隔离
- Task(任务) :
- 执行 算子(Operators)
- 通过 数据流(Stream) 进行计算
(3)存储层
Flink 需要持久化存储以下数据:
- 检查点(Checkpoint) → HDFS、S3、RocksDB
- 状态(State)存储 → RocksDB、内存
- 输入(Source)数据 → Kafka、MySQL、HDFS
- 输出(Sink)数据 → Elasticsearch、HDFS、Redis
3. Flink 作业执行流程
(1)任务提交
- Client 提交 Flink Job
- 解析代码,生成 JobGraph
- 发送 JobGraph 到 Dispatcher
- Dispatcher 分配 JobMaster
- 启动 JobMaster 处理任务
- JobMaster 解析 JobGraph ,构造 ExecutionGraph
(2)任务调度
- JobMaster 解析 ExecutionGraph
- 将 JobGraph 转换为并行执行图(ExecutionGraph)
- 按算子依赖关系进行任务切分
- ResourceManager 分配 TaskManager
- 申请 TaskSlot
- 分配 TaskManager 并启动 Task 任务
(3)任务执行
- TaskManager 启动 Task
- 运行算子(Operators)
- 处理数据流(Stream)
- 数据传输
- 通过 Shuffle、Network Stack 传输数据
- 任务之间通过 流(Stream) 传递数据
(4)状态管理 & 容错
- Checkpoint 机制
- 定期将 Task 状态 持久化到 HDFS、RocksDB
- 任务故障时,从最近的 Checkpoint 恢复
- Savepoint 机制
- 手动触发 Savepoint,支持 作业升级、代码变更后的恢复
- Failover
- 任务失败后,JobMaster 重新调度任务,恢复计算
4. Flink 任务并行度
Flink 是 并行计算框架,并行度的定义如下:
- 全局并行度(Global Parallelism)
- 由
execution.parallelism
决定,影响整个 Job
- 由
- 算子级别并行度(Operator Parallelism)
- 可以通过
operator.setParallelism(n)
设置
- 可以通过
- Task Slot 数量
- 每个 TaskManager 有多个 TaskSlot,影响作业运行
默认并行度
-
Flink 默认并行度为
1
,可以在flink-conf.yaml
配置:yamlparallelism.default: 4 # 设置默认并行度为 4
-
也可以通过代码指定:
javaenv.setParallelism(4);
5. Flink vs Spark 对比
对比项 | Flink | Spark |
---|---|---|
计算模式 | 流计算(Streaming First) | 批计算(Batch First) |
数据流模型 | 实时流(Unbounded Stream) | 微批处理(Micro-batch) |
状态管理 | 内置状态管理(RocksDB) | 依赖外部存储(HDFS、Redis) |
故障恢复 | 精准一次(Exactly Once) | 依赖 RDD 重计算 |
吞吐量 | 高吞吐、低延迟 | 吞吐量高但延迟较高 |
并行计算 | Task Slot 控制并行度 | RDD Partition 控制并行度 |
6. 结论
✅ Flink 采用 Master-Slave 架构 ,由 JobManager(主节点)+ TaskManager(工作节点)+ 存储层 组成
✅ 支持流计算和批计算 ,以 流计算优先(Streaming First) 为核心
✅ 高并发低延迟 ,支持 Exactly Once 语义 ,适用于 实时计算场景
✅ 任务并行度由 Task Slot、算子并行度决定 ,默认并行度为 1
,可调整
✅ 与 Spark 相比,Flink 在实时流计算方面更强,而 Spark 在离线计算更优秀
Savepoint
1. 什么是 Savepoint?
Savepoint 是 Flink 提供的一种手动触发的作业状态快照机制,用于:
- 任务升级、迁移(跨版本、跨集群恢复)
- 故障恢复(比 Checkpoint 更灵活)
- A/B 测试(从相同状态启动不同版本任务)
2. Savepoint vs Checkpoint
对比项 | Savepoint | Checkpoint |
---|---|---|
触发方式 | 手动触发 | 自动触发(周期性) |
存储内容 | 作业完整状态(可跨版本恢复) | 任务运行状态(仅用于故障恢复) |
存储位置 | HDFS / S3 / RocksDB / 文件系统 | HDFS / S3 / RocksDB |
用途 | 任务升级、迁移、测试 | 任务失败后自动恢复 |
适用场景 | 长期存储,版本切换 | 临时存储,断点恢复 |
数据一致性 | 需要手动触发,非实时 | 端到端 Exactly-Once |
总结 :
✅ Savepoint 适用于长期存储和版本迁移
✅ Checkpoint 适用于作业自动恢复
3. 如何使用 Savepoint?
3.1 触发 Savepoint
bash
flink savepoint job_id savepoint_path
例如:
bash
flink savepoint 123456 /flink/savepoints/
说明 :
job_id
是 Flink 任务 ID,savepoint_path
指定 Savepoint 存储位置(HDFS、S3等)。
3.2 使用 Savepoint 恢复作业
bash
flink run -s savepoint_path -c MainClass my-flink-job.jar
示例:
bash
flink run -s hdfs://flink/savepoints/savepoint-1234 my-job.jar
说明 :
-s
参数指定 Savepoint 位置,作业会从 Savepoint 处继续执行。
3.3 删除 Savepoint
Savepoint 需要手动删除:
bash
flink stop -s savepoint_path job_id
4. Savepoint 适用于哪些场景?
- 任务升级
- 旧版本任务 触发 Savepoint,新版本任务从 Savepoint 恢复
- 例如升级 Flink 作业时,保证状态不丢失
- 跨集群任务迁移
- 在 不同 Flink 集群 之间迁移作业
- 先在 A 集群 Savepoint,然后在 B 集群加载 Savepoint
- A/B 测试
- 从同一个 Savepoint 启动多个作业,对比不同算法版本效果
5. Savepoint vs Kafka Offset
对比项 | Savepoint | Kafka Offset |
---|---|---|
作用 | 存储 Flink 作业的所有状态 | 存储 Kafka 消费者消费位点 |
适用范围 | 所有 Flink 状态(窗口、聚合等) | 仅流式 Kafka 消费 Offset |
是否支持作业升级 | ✅ 支持 | ❌ 不支持 |
存储方式 | HDFS / S3 / RocksDB | Kafka 内部存储 |
✅ Savepoint 适用于 Flink 作业状态恢复
✅ Kafka Offset 适用于 Kafka 消费恢复
6. 总结
- Savepoint 适用于手动触发的状态持久化,用于任务升级、迁移、A/B 测试
- Checkpoint 适用于自动任务恢复,用于故障恢复
- Flink 任务可以从 Savepoint 恢复,保持状态一致
- Savepoint 需要手动管理和存储,Checkpoint 是临时的