执行 ./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能否运行mongodb flink run -s_应用程序

flink run 命令,会通过 ./flink 脚本执行。如上图:

  • 先执行 ./config.sh 脚本,进行基本配置
  • 程序入口:org.apache.flink.client.cli.CliFrontend  类中的 main 函数。

./config.sh 脚本

flink run能否运行mongodb flink run -s_配置文件_02

./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  

flink run能否运行mongodb flink run -s_配置文件_03

main方法中逻辑:

  1. 加载、解析配置文件。
  2. cli.parserParameters:解析命令并执行。

flink run能否运行mongodb flink run -s_flink_04

flink run命令方法的执行会 调用 run() 方法; prams 是 flink run 命令的参数。

run 函数

flink run能否运行mongodb flink run -s_配置文件_05

flink run能否运行mongodb flink run -s_flink_06

代码逻辑如下:

  1. 首先进行参数解析,转化成为Flink可以识别的对象:ProgramOptions
  2. 获取 Flink 应用程序的 Jar包,进行类加载。
  3. 执行用户的应用程序。

用户程序的执行

flink run能否运行mongodb flink run -s_应用程序_07

  • 首先保存用户的线程上下文加载器,替换成为用户应哟欧诺个程序加载器。

flink run能否运行mongodb flink run -s_应用程序_08

  • 然后从 EntryClass 中利用Java 反射获取 main 方法
  • 最后执行main 方法,整个流程就进入了用户的应用程序代码中。

问题回答

  • 问题1:./flink run 命令是如何记载配置文件的?

答:在 ./config.sh 中配置了 conf 文件的地址,然后在CliFrontend中加载配置文件;加载完毕的配置会存放在 ExecutionEnvironment的全局变量 contextEnvironmentFactory 中。这个全局变量保存了加载完毕的配置,后续会被用户的应用程序使用。

 

  • 问题2:./flink run 命令是如何解析用户 Jar 程序的 main方法的?

答:用过类加载找到Jar包中的entry point 类,然后通过反射找到main 方法,然后执行该方法即可。

 

文章作者:flink爱好者