Flink源码分析(一):flink run 命令背后的逻辑

举报
flink爱好者 发表于 2020/06/13 16:22:13 2020/06/13
【摘要】 执行 ./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方法中逻辑:

  1. 加载、解析配置文件。

  2. cli.parserParameters:解析命令并执行。


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


run 函数

代码逻辑如下:

  1. 首先进行参数解析,转化成为Flink可以识别的对象:ProgramOptions

  2. 获取 Flink 应用程序的 Jar包,进行类加载。

  3. 执行用户的应用程序。


用户程序的执行

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



  • 然后从 EntryClass 中利用Java 反射获取 main 方法

  • 最后执行main 方法,整个流程就进入了用户的应用程序代码中。


问题回答

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

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


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

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。