Flink源码分析(一):flink run 命令背后的逻辑
执行 ./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 方法,然后执行该方法即可。
- 点赞
- 收藏
- 关注作者
评论(0)