flinkjob 提交流程
任务启动流程图
可以先简单看下流程图,对比下面详细说明,再回来看会更加清晰
1客户端的工作内容
1.1解析命令
- 第一步是命令行的解析,根据用户提交的 flink run 命令,在客户端类cliFronted中进行解析
- 通过空格与-c -m 等参数指令,提取出,用户提交的参数详情
- 获取flink的conf目录的路径
- 根据conf目录的路径,加载配置
- 加载命令行的输入 command line 封装命令行接口:按顺序 generic yarn default
- 获取run动作 默认的配置项
- 根据用户指定的配置项 进行解析
这个帖子是根据flink1.12来做的基础,所以对比以后的版本可能会有一点出入,但总的流程都是一致的,例如,flink1.12中 任务的启动模式 会根据提交命令中指定的是否是yarn,standalone等来封装一个 command line 提交给后面使用,如果用户没有指定,flink就会根据默认顺序generic yarn default 来封装这个flink任务的启动模式
1.2 执行用户代码
用户代码会从env.execute开始执行
- 从StreamExecutionEnvironment开始 execute
- 根据用户代码 ,调用的算子,生成streamgraph图
- streamgraph 转化 jobgraph
- yarnjobClusterExcutor 创建启动 yarnclient 包含了一些yarn flink的配置和环境信息,并构造了一个yarnClusterDescriptor
- yarnClusterDescriptor 获取集群特有配置 : jobmanager 内存 每个taskmanager 内存 每个 slot槽数
- 部署前检查: jar包路径 conf路径 yarn最大核数 检查置顶的yarn队列是否存在, 检查yarn有足够的资源
- yarn启动appmaster AM 通过startAppMaster
2集群工作内容
2.1 启动AM
- 初始化文件系统
- 封装appcontext 一些环境信息 appid
- yarn应用的文件上传器初始化: fs hdfs路径
- 配置appid zk的namespace,高可用重试次数 id
2.2启动JobManager和 ResourceManager
- am启动dispatch和ResourceManager
- ResourceManager 中的 slotmanager 组件负责真正像yarn申请资源
- dispatch 启动 jobManager
- jobManage中的slotpool 负责真正发送请求
2.3 申请资源 启动 taskmanager
- JobManager 将JobGraph 转换 ExcuetionGraph
- jobManager 中的slotpool 想 ResourceManager发出申请资源的请求
- jobManager 收到 ResourceManager中来自 yarn 的许可的请求回复后,会启动TaskManager
3分配任务
3.1 资源计算
其实这是2.3中的工作,在申请资源时,flink在生成StreamGraph时,会根据用户代码,来计算任务的并行度,并计算出所需多少个slot,根据系统配置的slot大小,来计算所需任务的内容大小
3.2 分发任务
- tm启动后,tm中 TaskExecutor 会像 resourceManager 注册slot
- TaskExecutor 收到 resourceManager回复的肯定分配指令后,会把resourceManager给过来的offset,给到JobMaster
- JobMaster 会提交具体的task到TaskExecutor
- 任务就启动了
总结
-
flink cliFronted类, 解析参数,封装commandLine, 执行用户代码生成streamGraph 并将streamGraph转化成JobGraph
-
yarnjobClusterExcutor 初始化一个yarnclient对象,构造yarnClusterDescriptor
-
yarnClusterDescriptor 将 依赖,jar,及其集群配置上传到Yarn Resource manager上
-
yarn检查集群配置
-
启动 AM
-
AM 启动 dispatch 和 ResourceManager(里面有slotmanager 真正管理资源向yarn申请资源的)
-
dispatch 启动 JobMaster (里面有slotpool 真正发送请求的)
-
JobMaster 将 JobGraph 转换 ExcuetionGraph
-
JobMaster 向 Resourcemanager申请资源
-
Resourcemanager 向 yarn申请资源 启动 tm
-
tm启动后 TaskExecutor 向 resourceManager 注册slot
-
TaskExecutor 接收到分配的指令,提供offset给JobMaster
-
JobMaster 提交具体的task 到 TaskExecutor
-
JobManager 的 职 责 主 要 是 接 收 Flink 作 业 , 调 度 Task , 收 集 作 业 状 态 和 管 理TaskManager。
-
TaskManager 相当于整个集群的 Slave 节点,负责具体的任务执行和对应任务在每个节点上的资源申请和管理。
具体Graph中如何转换的 可以参考 https://blog.csdn.net/Direction_Wind/article/details/121773408