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个步骤:
-
加载环境变量,包括 code revision, current user, Java version, Hadoop version, JVM parameters等,然后从环境变量中获取到flink的配置目录
-
解析配置,读取``flink-conf.yaml`,如下图所示
-
初始化命令行解析入口,这里包含了一下三种命令行解析入口类
//运行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
-
初始化
CliFrontend
,执行cli.parseAndRun(args)
,完成flink client的主要逻辑,其中我们最需要关注的,便是cli.parseAndRun(args)
做了些什么事情。
命令行解析和运行
进入parseAndRun
函数中,可以看到程序通过解析第一个参数,来判断进入进入哪种具体的逻辑,然后把args[1:]的作为参数params
传入具体函数里。这里我们使用第一种,即进入run(params)
中。
public int parseAndRun(String[] args