Flink 底层原理系列(九):部署模式
2021-03-30·4 分钟阅读
前言
Flink 支持多种部署模式,不同模式适用于不同场景。理解各模式的特点和适用场景,对于生产环境部署至关重要。
技术亮点
| 技术点 | 难度 | 面试价值 | 本文覆盖 |
|---|---|---|---|
| Session 模式 | ⭐⭐⭐ | 高频考点 | ✅ |
| Per-Job 模式 | ⭐⭐⭐ | 高频考点 | ✅ |
| Application 模式 | ⭐⭐⭐⭐ | 进阶考点 | ✅ |
| K8s 部署 | ⭐⭐⭐⭐ | 实战价值 | ✅ |
面试考点
- Flink 有哪些部署模式?各有什么优缺点?
- Session 模式和 Per-Job 模式有什么区别?
- Application 模式有什么优势?
- 如何在 Kubernetes 上部署 Flink?
三种部署模式
模式对比
┌─────────────────────────────────────────────────────────────────────────┐
│ 三种部署模式对比 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 特性 Session Per-Job Application │ │
│ │ ────────────────────────────────────────────────────────────── │ │
│ │ 集群共享 是 否 否 │ │
│ │ JobManager 共享 独占 独占 │ │
│ │ 资源隔离 弱 强 强 │ │
│ │ 资源利用率 高 低 中 │ │
│ │ 启动开销 低 高 中 │ │
│ │ 适用场景 开发测试 生产环境 生产环境 │ │
│ │ main() 执行位置 客户端 客户端 JobManager │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
Session 模式
┌─────────────────────────────────────────────────────────────────────────┐
│ Session 模式 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 架构图: │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Flink Cluster │ │
│ │ ┌───────────────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ JobManager (共享) │ │ │
│ │ │ ┌─────────────────────────────────────────────┐ │ │ │
│ │ │ │ Job 1 │ Job 2 │ Job 3 │ ... │ │ │ │
│ │ │ └─────────────────────────────────────────────┘ │ │ │
│ │ │ │ │ │ │
│ │ │ ▼ │ │ │
│ │ │ ┌─────────────────────────────────────────────┐ │ │ │
│ │ │ │ TaskManager 1 │ TaskManager 2 │ ... │ │ │ │
│ │ │ └─────────────────────────────────────────────┘ │ │ │
│ │ │ │ │ │
│ │ └───────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ Client 1 Client 2 Client 3 │ │
│ │ │ │ │ │ │
│ │ ▼ ▼ ▼ │ │
│ │ 提交 Job 1 提交 Job 2 提交 Job 3 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 特点: │
│ • 多个作业共享一个集群 │
│ • JobManager 管理所有作业 │
│ • 资源动态分配 │
│ │
│ 优点: │
│ • 资源利用率高 │
│ • 启动快(集群已存在) │
│ • 适合多作业场景 │
│ │
│ 缺点: │
│ • 资源隔离弱 │
│ • 单点故障影响所有作业 │
│ • 作业之间可能相互影响 │
│ │
│ 启动命令: │
│ # 启动集群 │
│ ./bin/start-cluster.sh │
│ # 提交作业 │
│ ./bin/flink run -d my-job.jar │
│ │
└─────────────────────────────────────────────────────────────────────────┘
Per-Job 模式
┌─────────────────────────────────────────────────────────────────────────┐
│ Per-Job 模式 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 架构图: │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ┌────────────────────┐ ┌────────────────────┐ │ │
│ │ │ Flink Cluster 1 │ │ Flink Cluster 2 │ │ │
│ │ │ ┌────────────────┐ │ │ ┌────────────────┐ │ │ │
│ │ │ │ JobManager │ │ │ │ JobManager │ │ │ │
│ │ │ │ (Job 1) │ │ │ │ (Job 2) │ │ │ │
│ │ │ └────────────────┘ │ │ └────────────────┘ │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ │ ▼ │ │ ▼ │ │ │
│ │ │ ┌────────────────┐ │ │ ┌────────────────┐ │ │ │
│ │ │ │ TaskManagers │ │ │ │ TaskManagers │ │ │ │
│ │ │ └────────────────┘ │ │ └────────────────┘ │ │ │
│ │ └────────────────────┘ └────────────────────┘ │ │
│ │ │ │
│ │ Client 1 Client 2 │ │
│ │ │ │ │ │
│ │ ▼ ▼ │ │
│ │ 创建集群+提交 Job 1 创建集群+提交 Job 2 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 特点: │
│ • 每个作业独立的集群 │
│ • 独占 JobManager │
│ • 资源完全隔离 │
│ │
│ 优点: │
│ • 资源隔离强 │
│ • 故障隔离 │
│ • 适合生产环境 │
│ │
│ 缺点: │
│ • 资源利用率较低 │
│ • 启动慢(需创建集群) │
│ • JobManager 资源占用 │
│ │
│ YARN 提交命令: │
│ ./bin/flink run -m yarn-cluster -d my-job.jar │
│ │
└─────────────────────────────────────────────────────────────────────────┘
Application 模式
┌─────────────────────────────────────────────────────────────────────────┐
│ Application 模式 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 架构图: │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Client │ │
│ │ ┌───────────────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ 仅提交 JAR 到集群,main() 在 JobManager 中执行 │ │ │
│ │ │ │ │ │
│ │ └───────────────────────────────────────────────────────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌───────────────────────────────────────────────────────────┐ │ │
│ │ │ Flink Cluster │ │ │
│ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │
│ │ │ │ JobManager │ │ │ │
│ │ │ │ ┌───────────────────────────────────────────────┐ │ │ │ │
│ │ │ │ │ main() 执行 │ │ │ │ │
│ │ │ │ │ ┌─────────────────────────────────────────┐ │ │ │ │ │
│ │ │ │ │ │ Job 1 │ Job 2 │ Job 3 (同一应用) │ │ │ │ │ │
│ │ │ │ │ └─────────────────────────────────────────┘ │ │ │ │ │
│ │ │ │ └───────────────────────────────────────────────┘ │ │ │ │
│ │ │ │ │ │ │ │ │
│ │ │ │ ▼ │ │ │ │
│ │ │ │ ┌─────────────────────────────────────────────┐ │ │ │ │
│ │ │ │ │ TaskManager 1 │ TaskManager 2 │ ... │ │ │ │ │
│ │ │ │ └─────────────────────────────────────────────┘ │ │ │ │
│ │ │ └─────────────────────────────────────────────────────┘ │ │ │
│ │ │ │ │ │
│ │ └───────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 特点: │
│ • main() 在 JobManager 中执行 │
│ • 一个应用可包含多个作业 │
│ • 减少 Client 负载 │
│ │
│ 优点: │
│ • 减少 Client 资源占用 │
│ • 减少网络传输 │
│ • 适合多作业应用 │
│ │
│ YARN 提交命令: │
│ ./bin/flink run-application -t yarn-application my-job.jar │
│ │
│ K8s 提交命令: │
│ ./bin/flink run-application -t kubernetes-application my-job.jar │
│ │
└─────────────────────────────────────────────────────────────────────────┘
Kubernetes 部署
K8s 部署架构
┌─────────────────────────────────────────────────────────────────────────┐
│ Kubernetes 部署 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Kubernetes Cluster │ │
│ │ ┌───────────────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ ┌─────────────────┐ ┌─────────────────┐ │ │ │
│ │ │ │ JobManager Pod │ │ TaskManager Pod │ │ │ │
│ │ │ │ ┌─────────────┐ │ │ ┌─────────────┐ │ │ │ │
│ │ │ │ │ JobManager │ │ │ │ TaskManager │ │ │ │ │
│ │ │ │ │ Process │ │ │ │ Process │ │ │ │ │
│ │ │ │ └─────────────┘ │ │ └─────────────┘ │ │ │ │
│ │ │ │ Service │ │ (多副本) │ │ │ │
│ │ │ └─────────────────┘ └─────────────────┘ │ │ │
│ │ │ │ │ │
│ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │
│ │ │ │ ConfigMap │ Secret │ PersistentVolume │ ... │ │ │ │
│ │ │ └─────────────────────────────────────────────────────┘ │ │ │
│ │ │ │ │ │
│ │ └───────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ K8s 部署命令: │
│ # Session 模式 │
│ ./bin/kubernetes-session.sh -Dkubernetes.cluster-id=my-cluster │
│ # Application 模式 │
│ ./bin/flink run-application -t kubernetes-application my-job.jar │
│ │
└─────────────────────────────────────────────────────────────────────────┘
K8s 配置示例
# flink-configuration-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: flink-config
data:
flink-conf.yaml: |+
jobmanager.rpc.address: flink-jobmanager
taskmanager.numberOfTaskSlots: 2
parallelism.default: 2
state.backend: rocksdb
state.checkpoints.dir: file:///flink-data/checkpoints
high-availability: zookeeper
high-availability.zookeeper.quorum: zk:2181
高可用配置
┌─────────────────────────────────────────────────────────────────────────┐
│ 高可用配置 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 基于 ZooKeeper 的 HA 配置: │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ # flink-conf.yaml │ │
│ │ │ │
│ │ # 高可用模式 │ │
│ │ high-availability: zookeeper │ │
│ │ │ │
│ │ # ZooKeeper 地址 │ │
│ │ high-availability.zookeeper.quorum: zk1:2181,zk2:2181 │ │
│ │ │ │
│ │ # 存储目录 │ │
│ │ high-availability.storageDir: hdfs:///flink/ha/ │ │
│ │ │ │
│ │ # 集群 ID │ │
│ │ high-availability.cluster-id: /flink-cluster │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ HA 工作原理: │
│ 1. 多个 JobManager 同时运行 │
│ 2. ZooKeeper 进行 Leader 选举 │
│ 3. Leader 故障后,Standby 接管 │
│ 4. 从共享存储恢复 JobGraph 和 Checkpoint │
│ │
└─────────────────────────────────────────────────────────────────────────┘
总结
本章深入解析了 Flink 部署模式:
| 模式 | 特点 | 适用场景 |
|---|---|---|
| Session | 多作业共享集群 | 开发测试 |
| Per-Job | 每个作业独立集群 | 生产环境 |
| Application | main() 在集群执行 | 生产环境多作业 |
参考资料
下一章预告
下一章将深入解析 生产实践,包括:
- 监控与告警
- 性能调优
- 故障排查