flink作业提交源码解析(1)-命令行解析及运行

flink作业提交源码解析(1)-命令行解析及运行

原文链接

版本

flink: release-1.14
os: ubuntu 16.04
IDE: IDEA

bin/flink 这个提交脚本最后一行

exec "${JAVA_RUN}" $JVM_ARGS $FLINK_ENV_JAVA_OPTS "${log_setting[@]}" -classpath "`manglePathList "$CC_CLASSPATH:$INTERNAL_HADOOP_CLASSPATHS"`" org.apache.flink.client.cli.CliFrontend "$@"

可以看出,入口类为org.apache.flink.client.cli.CliFrontend

开启远程调试功能,在org.apache.flink.client.cli.CliFrontend的main函数中打断点。

总流程

flink-client 入口: CliFrontend.java

 /** Submits the job based on the arguments. */
    public static void main(final String[] args) {
   
        //加载环境变量,包括 code revision, current user, Java version, Hadoop version, JVM parameters
        EnvironmentInformation.logEnvironmentInfo(LOG, "Command Line Client", args);

        // 1. find the configuration directory
        final String configurationDirectory = getConfigurationDirectoryFromEnv();

        // 2. load the global configuration
        final Configuration configuration =
                GlobalConfiguration.loadConfiguration(configurationDirectory);

        // 3. load the custom command lines
        final List<CustomCommandLine> customCommandLines =
                loadCustomCommandLines(configuration, configurationDirectory);

        int retCode = 31;
        try {
   
            final CliFrontend cli = new CliFrontend(configuration, customCommandLines);

            SecurityUtils.install(new SecurityConfiguration(cli.configuration));
            retCode = SecurityUtils.getInstalledContext().runSecured(() -> cli.parseAndRun(args));
        } catch (Throwable t) {
   
            final Throwable strippedThrowable =
                    ExceptionUtils.stripException(t, UndeclaredThrowableException.class);
            LOG.error("Fatal error while running command line interface.", strippedThrowable);
            strippedThrowable.printStackTrace();
        } finally {
   
            System.exit(retCode);
        }
    }

主要分为4个步骤:

  1. 加载环境变量,包括 code revision, current user, Java version, Hadoop version, JVM parameters等,然后从环境变量中获取到flink的配置目录

  2. 解析配置,读取``flink-conf.yaml`,如下图所示
    flink作业提交源码解析(1)-命令行解析及运行_第1张图片

  3. 初始化命令行解析入口,这里包含了一下三种命令行解析入口类

    //运行bin/flink run-application xx 或者bin/flink run -t xxx的 ,
    //-t包含了"remote", "local", "kubernetes-session","yarn-per-job", "yarn-session"等模式
    org.apache.flink.client.cli.GenericCLI
    //提交到yarn session集群的命令行解析入口
    org.apache.flink.yarn.cli.FlinkYarnSessionCli
    //默认的命令行解析入口类,提交到standalone集群
    org.apache.flink.client.cli.DefaultCLI
    
  4. 初始化CliFrontend,执行cli.parseAndRun(args),完成flink client的主要逻辑,其中我们最需要关注的,便是cli.parseAndRun(args)做了些什么事情。

命令行解析和运行

进入parseAndRun函数中,可以看到程序通过解析第一个参数,来判断进入进入哪种具体的逻辑,然后把args[1:]的作为参数params传入具体函数里。这里我们使用第一种,即进入run(params)中。

public int parseAndRun(String[] args

你可能感兴趣的:(flink,flink,java)