一、总体架构概览
architecture.png&pos_id=img-frKicYYC-1739189786478)
Flink采用典型的主从架构,主要包含以下核心组件:
1. JobManager(作业管理器)
职责矩阵:
| 功能模块 | 说明 | |-------------------|----------------------------------------------------------------------| | JobMaster | 单个作业的协调中心,负责调度、Checkpoint协调、故障恢复 | | ResourceManager | 集群资源管理(Flink原生/YARN/K8s适配) | | Dispatcher | 提供REST接口,作业提交入口,为每个作业启动JobMaster |
关键机制:
- 基于Actor模型的消息传递(Akka实现)
- Exactly-Once语义的Checkpoint协调
- 故障检测(心跳机制+ZooKeeper)
2. TaskManager(任务管理器)
- 核心能力:
// 伪代码示例:Task执行流程 while (hasInput()) { StreamRecord record = input.poll(); userFunction.processElement(record); if (checkpointTriggered) { snapshotState(); } }
- 内存结构:
内存区域 占比 用途 Network Buffers 20% 数据交换缓存 Managed Memory 40% RocksDB状态后端/批处理排序 JVM Heap 40% 用户代码内存分配
3. Client(客户端)
- 执行流程:
- 解析用户程序生成JobGraph
- 通过REST提交到Dispatcher
- 获取执行进度监控
二、运行时执行模型
1. 任务拓扑结构
2. 数据传输机制
- 背压(Backpressure):
- 基于信用值的流量控制(Credit-Based)
- 网络栈优化:
1. 数据序列化阶段使用堆外内存 2. 批量发送机制(BufferTimeout调优) 3. 零拷贝技术(同一TM内共享内存)
三、状态管理架构
1. 状态类型矩阵
状态类型 | 存储方式 | 适用场景 |
---|---|---|
Keyed State | 每个Key对应状态实例 | 分组统计/窗口聚合 |
Operator State | 算子级别状态 | 源连接器偏移量记录 |
Broadcast State | 全局可读的广播状态 | 规则动态更新 |
2. 状态后端对比
| | MemoryStateBackend | FsStateBackend | RocksDBStateBackend |
|-------------------|------------------------|----------------------|-----------------------|
| 存储介质 | JVM Heap | 文件系统+Heap | 本地磁盘+RocksDB |
| 容量限制 | <1GB | 单TM内存上限 | 本地磁盘容量 |
| 恢复速度 | 快 | 中等 | 较慢 |
| Checkpoint耗时 | 低 | 中等 | 高 |
四、容错机制实现
1. Checkpoint执行流程
- JobMaster触发检查点屏障(Barrier)
- Barrier通过数据流传播
- 算子对齐状态快照
- 异步持久化到持久存储
2. 恢复策略优化
- 增量Checkpoint:仅保存差异数据(RocksDB特性)
- 非对齐Checkpoint:允许Barrier乱序(Flink 1.11+)
- Savepoint:人工触发的全量持久化点
五、资源管理架构
1. 部署模式对比
模式 | 资源申请方 | 适用场景 |
---|---|---|
Session Mode | 预先分配 | 短期作业/测试环境 |
Per-Job Mode | 按需申请 | 生产环境长期作业 |
Application Mode | 客户端集成 | Kubernetes环境部署 |
2. 动态资源扩展
1. ResourceManager监控Slot利用率
2. 向YARN/K8s申请新TaskManager
3. 注册新Slots到集群
4. JobMaster重新调度任务
六、网络栈优化
1. 数据传输模式
- Pipelined:流式传输(默认)
- Batch:阶段式传输(批处理优化)
2. 反压传播机制
七、最新架构演进
统一批流架构:
- 批处理作为有界流的特例处理
- 自适应执行模式(Batch/Streaming自动切换)
云原生优化(目前我们主要就是投入在这个方向,便于自动化运维及高级韵味):
- Kubernetes原生部署支持增强
- 弹性伸缩API标准化
状态后端改进:
- 分层状态存储(Hot/Warm/Cold Data)
- 基于JDK 17的ZGC内存优化
根据实际使用场景关注:
- 高可用配置(ZooKeeper/K8s)
- 状态后端选型(吞吐量 vs 延迟)
- 网络参数调优(taskmanager.network.memory.fraction)
- Checkpoint间隔平衡(可靠性 vs 性能)