0 简介
Yarn-per-job模式提交流程 总图
![](https://img2020.cnblogs.com/blog/1275415/202103/1275415-20210304213756304-366043291.png)
1 程序起点
1)flinkinflink
=> exec $JAVA_RUN $JVM_ARGS "${log_setting[@]}" -classpath "`manglePathList "$CC_CLASSPATH:$INTERNAL_HADOOP_CLASSPATHS"`"
org.apache.flink.client.cli.CliFrontend "$@"
2)flink/bin/config.sh(相关环境配置都在这里)
=> JAVA_RUN=java
=> JVM_ARGS="" => # Use conf/flink-conf.yaml
=>INTERNAL_HADOOP_CLASSPATHS="${HADOOP_CLASSPATH}:${HADOOP_CONF_DIR}:${YARN_CONF_DIR}"
3)执行 java -cp 就会开启 JVM 虚拟机,在虚拟机上开启 CliFrontend 进程,然后开始执行main 方法
说明:java -cp 和 -classpath 一样,是指定类运行所依赖其他类的路径。
java -cp =》开启 JVM 虚拟机 =》开启 Process(CliFrontend)=》程序入口 CliFrontend.main
4)Flink 提交任务的入口类为 CliFrontend。找到这个类的 main 方法:
在 IDEA 中全局查找(ctrl + n):org.apache.flink.client.cli.CliFrontend,找到 CliFrontend类,并找到 main 方法
![](https://img2020.cnblogs.com/blog/1275415/202103/1275415-20210307155911297-682550187.png)
2 创建 Yarn 客户端应用程序
2.1 程序入口
CliFrontend.java
![](https://img2020.cnblogs.com/blog/1275415/202103/1275415-20210307155957605-1569202318.png)
2.2 解析输入参数
CliFrontend.java
![](https://img2020.cnblogs.com/blog/1275415/202103/1275415-20210307160232584-1627829408.png)
DefaultParser.java
![](https://img2020.cnblogs.com/blog/1275415/202103/1275415-20210307162352097-7753284.png)
DefaultParser.java
![](https://img2020.cnblogs.com/blog/1275415/202103/1275415-20210307162445082-18473682.png)
各种情况的解析,逻辑大体相同:去除-或--前缀,校验参数,以其中一个为例
![](https://img2020.cnblogs.com/blog/1275415/202103/1275415-20210307162752471-85742511.png)
Options.java:
![](https://img2020.cnblogs.com/blog/1275415/202103/1275415-20210307162834327-2074837842.png)
DefaultParser.java
![](https://img2020.cnblogs.com/blog/1275415/202103/1275415-20210307163013511-716882473.png)