← 返回文章列表

Flink 底层原理系列(九):部署模式

2021-03-30·4 分钟阅读

前言

Flink 支持多种部署模式,不同模式适用于不同场景。理解各模式的特点和适用场景,对于生产环境部署至关重要。

技术亮点

技术点难度面试价值本文覆盖
Session 模式⭐⭐⭐高频考点
Per-Job 模式⭐⭐⭐高频考点
Application 模式⭐⭐⭐⭐进阶考点
K8s 部署⭐⭐⭐⭐实战价值

面试考点

  1. Flink 有哪些部署模式?各有什么优缺点?
  2. Session 模式和 Per-Job 模式有什么区别?
  3. Application 模式有什么优势?
  4. 如何在 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每个作业独立集群生产环境
Applicationmain() 在集群执行生产环境多作业

参考资料

下一章预告

下一章将深入解析 生产实践,包括:

  • 监控与告警
  • 性能调优
  • 故障排查
分享: