1、集群架构

1)JobManager:
主要作用:整个集群资源的管理以及相应的一些调度工作
- checkpoint的协调和执行:通过文件检查点的方式记录一些状态性的数据
- jobGraph生成Execution Graph
- Task部署与调度
- RPC的通信:基于Akka实现的,核心组件:Actor System
- 对Job的接收:Job的拆分与分发
- ResourceManager:集群资源管理器
- TaskManager注册与管理
2)TaskManager
- TaskManager是JVM的话,Task Slot是线程;
- Data交换:shuffle过程,提供shuffle Environment管理,Network Manager基于netty实现
- RPC通信:TaskManager与JobManager交互通过AKKa实现
- 内存管理:Memory Manager
- 向RM注册
- 为JobManager提供Slot
3)Client
- 执行main方法:
- 生成JobGraph:有向无环图
- 执行环境管理:Context Environment
- Job提交与运行
- 依赖Jar包ship到JobManager
- 通过RPC与JobManager通信:基于Akka实现
- 集群部署
2、JobGraph

- 通过反射的方式调用application的main方法;
- Executor执行器:本地执行器、远程执行器,on YARN执行器,
- execute生成StreamGraph
- submit方法将jobGraph提交到JobManager
3、集群部署模式
分类条件:
- 集群的生命周期和资源隔离
- 根据main方法执行在Client还是JobManager
分类:
- Session Mode
- 共享JobManager和TaskManager,所有提交的Job都在一个Runtime中运行
- Per-Job Mode
- 独享JobManager和TaskManager,好比为每个Job单独启动一个Runtime
- Application Mode
- Application的main运行在cluster上,而不在客户端
- 每个Application对应一个Runtime,Application中可以包含多个Job
1)Session Mode
Session集群运行模式:
- JM与TM共享
- 客户端通过RPC或Rest API连接集群的管理节点
- Deployer需要上传依赖的Jar包
- Deployer需要生成JobGraph,并提交到管理节点
- JM的生命周期不受提交的Job影响,会长期运行
优点:
- 资源充分共享,提升资源利用率
- Job在Flink Session集群中管理,运维简单
缺点:
- 资源隔离相对较差
- 非Native类型部署,TM不易拓展,Slot计算资源伸缩性较差
2)Per-job运行模式
Per-Job类型集群:
- 单个Job独享JM和TM
- TM中Slot资源根据Job指定
- Deployer需要上传依赖的Jar包
- 客户端生成JobGraph,并提交到管理节点
- JM的生命周期和Job生命周期绑定
优势:
- Job和Job之间资源隔离充分
- 资源根据Job需要进行申请,TM Slot数量可以不同
缺点:
- 资源相对比较浪费,JM需要消耗资源
- Job管理完全交给ClusterManager,管理复杂
Session集群和Per-Job集群的问题:
- 作业提交是阻塞的,如果大量用户提交作业的话,会造成大面积的任务等待
3)Application Mode
Application Mode类型集群(1.11):
- 每个Application对应一个JM,且可以运行多个Job
- 客户端无需将依赖上传到JM,仅负责管理Job的提交与管理
- main方法运行在JM中,将JobGraph的生成放在集群上运行,客户端压力降低
优点:
- 有效降低带宽消耗和客户端负载
- Application实现资源隔离,Application中实现资源共享
缺点:
- 功能太新,未经生产验证(阿里内部应该是这种模式)
- 仅支持Yarn和Kubunetes(需要构建镜像)
4、Flink支持的资源管理器
- standalone
- Hadoop Yarn
- Apache Mesos
- Docker
- Kubernetes

Native集群部署:
- 当在CLusterManager上启动Session集群时,只启动JM,不启动有TM
- 当提交Job-1后根据Job的资源申请,动态启动TM满足计算需求
- 当启动Job-2,Job-3后,再次向CLusterManager中申请TM资源

5、Standalone集群
特点:
- 分布式多台物理主机部署
- 依赖Java8或Java11JDK环境
- 仅支持Session模式提交Job
- 支持高可用配置

Mater节点进程名:StandaloneSessionCLusterEntrypoint
TaskManager节点进程名:TaskManagerRunner
