Flink 部署
概述
Flink 作业要稳定运行,部署模式与资源配置是关键:Standalone 简单、YARN 适合大数据集群、Kubernetes 适合云原生。本文讲清三种模式、高可用配置、内存模型(TaskManager 内存划分)与资源规划。
一、部署模式总览
| 模式 | 资源管理 | 适用 | 复杂度 |
|---|---|---|---|
| Standalone | Flink 自带 | 测试、小集群 | 低 |
| YARN | Hadoop 集群 | 大数据生产 | 中 |
| Kubernetes | 容器编排 | 云原生 | 高 |
二、Standalone
2.1 架构
JobManager(主)
├── TaskManager
├── TaskManager
└── TaskManager| 组件 | 启动 |
|---|---|
| JobManager | start-cluster.sh |
| TaskManager | 自动注册 |
| Web UI | 默认 8081 |
2.2 特点
| 优点 | 缺点 |
|---|---|
| 部署简单 | 无多租户 |
| 无需额外组件 | 资源管理弱 |
bash
./bin/start-cluster.sh
./bin/flink run -d -p 4 job.jar三、YARN 模式
3.1 交互
Flink 作为 YARN 应用运行:
ApplicationMaster 中启动 JobManager
Container 中运行 TaskManager| 模式 | 说明 |
|---|---|
| Application 模式 | 每作业一个集群(推荐) |
| Per-Job | 每作业提交 |
| Session | 共享集群 |
3.2 提交
bash
# Application 模式
flink run-application -t yarn-application \
-Djobmanager.memory.process.size=2048m \
-Dtaskmanager.memory.process.size=4096m \
-Dtaskmanager.numberOfTaskSlots=4 \
job.jar| 参数 | 说明 |
|---|---|
yarn.application.name | 应用名 |
yarn.application.queue | 队列 |
taskmanager.memory.process.size | TM 总内存 |
taskmanager.numberOfTaskSlots | 槽位数 |
3.3 对比
| 模式 | 场景 |
|---|---|
| Application | 长期作业、资源隔离(推荐) |
| Session | 短任务、共享资源 |
| Per-Job | 过渡方案 |
四、Kubernetes 模式
4.1 特点
| 优点 | 说明 |
|---|---|
| 弹性 | Pod 扩缩 |
| 隔离 | 容器级 |
| 云原生 | 集成云平台 |
| 挑战 | 说明 |
|---|---|
| 运维复杂 | K8s 技能要求 |
| 网络 | 容器网络 |
| 监控 | 需配套可观测性 |
4.2 提交
bash
flink run-application -t kubernetes-application \
-Dkubernetes.cluster-id=flink-cluster \
-Dkubernetes.container.image=flink:1.17 \
-Djobmanager.memory.process.size=2048m \
-Dtaskmanager.memory.process.size=4096m \
job.jar五、高可用配置
5.1 高可用需求
JobManager 单点故障 → 作业全部失败
高可用:多 JobManager 选举 + 作业自动恢复5.2 各模式高可用
| 模式 | HA 方案 |
|---|---|
| Standalone | ZooKeeper 选举 |
| YARN | YARN 自动重启 AM |
| Kubernetes | K8s 自动重启 Pod |
5.3 配置(Standalone + ZK)
yaml
# flink-conf.yaml
high-availability: zookeeper
high-availability.zookeeper.quorum: zk1:2181,zk2:2181
high-availability.storageDir: hdfs:///flink/ha
high-availability.zookeeper.path.root: /flink| 组件 | 作用 |
|---|---|
| ZooKeeper | Leader 选举 |
| storageDir | 作业元数据持久化 |
| Follower | 故障接任 |
六、内存模型
6.1 TaskManager 内存
TaskManager 进程内存
├── JVM 堆
│ ├── 框架堆内存(框架用)
│ ├── Task 堆内存(用户代码)
│ └── 托管内存(RocksDB/排序)
└── JVM 堆外
├── 框架堆外
├── Task 堆外(网络缓冲)
└── 直接内存6.2 配置项
| 参数 | 说明 |
|---|---|
taskmanager.memory.process.size | 进程总内存 |
taskmanager.memory.task.heap.size | Task 堆 |
taskmanager.memory.managed.size | 托管内存(RocksDB) |
taskmanager.memory.framework.heap.size | 框架堆 |
taskmanager.memory.task.off-heap.size | Task 堆外 |
taskmanager.memory.network.size | 网络缓冲 |
6.3 JobManager 内存
| 参数 | 说明 |
|---|---|
jobmanager.memory.process.size | JM 总内存 |
jobmanager.memory.heap.size | JM 堆 |
jobmanager.memory.off-heap.size | JM 堆外 |
6.4 内存配置思路
1. 先定 process.size(总内存)
2. 框架与网络给足默认
3. 托管内存:RocksDB 状态大则调大
4. 用户堆:计算所需| 场景 | 调整 |
|---|---|
| 状态大(RocksDB) | 调大 managed.size |
| 高吞吐 Shuffle | 调大 network.size |
| 复杂计算 | 调大 task.heap |
七、资源规划
7.1 规划步骤
1. 确定并行度(并行度 = 分区数等)
2. 计算 TaskManager 数:
TM 数 = 并行度 ÷ Slot 数
3. 每 TM 内存:状态大小 + 计算开销
4. 留余量:高峰与恢复7.2 经验值
| 项 | 建议 |
|---|---|
| Slot/TM | 4-8 |
| TM 内存 | 8-16g |
| 并行度 | 与 Source/Sink 吞吐匹配 |
| 余量 | 20-30% |
常见问题速查
| 问题 | 原因与处理 |
|---|---|
| 作业启动失败 | 内存参数不足,调大 process.size |
| 高可用不生效 | ZK/存储配置错误 |
| Slot 不足 | 并行度 > 总 Slot,扩容 |
| 网络缓冲不足 | 调大 network.size |
| YARN 提交失败 | 队列资源或权限问题 |