执行 ./flink run 命令,可以向 Flink Yarn Session 集群 、Flink Standalone 集群 提交任务,并且执行。带着疑问思考如如下问题:问题1:./flink run 命令是如何记载配置文件的?问题2:./flink run 命令是如何解析用户 Jar 程序的 Main 方法的?./flink 脚本flink run 命令,会通过 ./flink 脚...
执行 ./flink run 命令,可以向 Flink Yarn Session 集群 、Flink Standalone 集群 提交任务执行。
带着疑问思考如下问题:
- 问题1:./flink run 命令是如何记载配置文件的?
- 问题2:./flink run 命令是如何解析用户 Jar 程序的 Main 方法的?
./flink 脚本
flink run 命令,会通过 ./flink 脚本执行。如上图:
- 先执行 ./config.sh 脚本,进行基本配置
- 程序入口:org.apache.flink.client.cli.CliFrontend 类中的 main 函数。
./config.sh 脚本
./config.sh 脚本中会导入一些环变量:
- FLINK_CONF_DIR:flink 的配置信息地址。
- FLINK_BIN_DIR:flink 的bin目录地址。
- FLINK_PLUGINS_DIR:flink 的插件地址。
- $JAVA:java 命令的地址。
这些环境变量会被 ./flink、./yarn-session.sh 等脚本使用。
入口类:org.apache.flink.client.cli.CliFrontend
main方法中逻辑:
- 加载、解析配置文件。
- cli.parserParameters:解析命令并执行。
flink run命令方法的执行会 调用 run() 方法; prams 是 flink run 命令的参数。
run 函数
代码逻辑如下:
- 首先进行参数解析,转化成为Flink可以识别的对象:ProgramOptions
- 获取 Flink 应用程序的 Jar包,进行类加载。
- 执行用户的应用程序。
用户程序的执行
- 首先保存用户的线程上下文加载器,替换成为用户应哟欧诺个程序加载器。
- 然后从 EntryClass 中利用Java 反射获取 main 方法
- 最后执行main 方法,整个流程就进入了用户的应用程序代码中。
问题回答
- 问题1:./flink run 命令是如何记载配置文件的?
答:在 ./config.sh 中配置了 conf 文件的地址,然后在CliFrontend中加载配置文件;加载完毕的配置会存放在 ExecutionEnvironment的全局变量 contextEnvironmentFactory 中。这个全局变量保存了加载完毕的配置,后续会被用户的应用程序使用。
- 问题2:./flink run 命令是如何解析用户 Jar 程序的 main方法的?
答:用过类加载找到Jar包中的entry point 类,然后通过反射找到main 方法,然后执行该方法即可。
文章作者:flink爱好者