Flink1.13.1源码解析-Application on yarn(一)
本篇文章讲述 Flink Application On Yarn 提交模式下,从命令提交到 AM 容器创建
1、脚本入口
flink run-application -t yarn-application hdfs:///TopSpeedWindowing.jar
以上是flink application 模式的 任务提交命令,可以发现,任务提交入口在 FLINK_HOME/bin 目录中的flink 脚本中

根据flink 脚本中的执行操作,可发现flink 脚本最终指向了 org.apache.flink.client.cli.CliFrontend 这个入口类
2、flink 程序入口类org.apache.flink.client.cli.CliFrontend
main 作为程序的入口方法,从main 方法开始进行代码跟踪

根据 CliFrontend 中的main 方法,可以发现,在执行命令前,进行了一些环境的信息输出,flink 配置加载,运行环境准备等工作,最后 执行了 parseAndRun 方法,开始执行。
进入parseAndRun 方法,发现,系统根据提交命令参数进行解析,提取执行命令的类型,根据命令类型不同,执行对应的操作。

进入 runApplication 方法 ,继续跟踪 application 模式下的任务提交逻辑
protected void runApplication(String[] args) throws Exception {
LOG.info("Running 'run-application' command.");
final Options commandOptions = CliFrontendParser.getRunCommandOptions();
//todo 组装提交命令行对象
final CommandLine commandLine = getCommandLine(commandOptions, args, true);
// todo 如果包含help 命令 比如 flink flink run-application --help 这种命令,那么就进行命令帮助输出
if (commandLine.hasOption(HELP_OPTION.getOpt())) {
CliFrontendParser.printHelpForRunApplication(customCommandLines);
return;
}
// todo 获取激活的命令行对象
final CustomCommandLine activeCommandLine =
validateAndGetActiveCommandLine(checkNotNull(commandLine));
final ApplicationDeployer deployer =
new ApplicationClusterDeployer(clusterClientServiceLoader);
final ProgramOptions programOptions;
final Configuration effectiveConfiguration;
// No need to set a jarFile path for Pyflink job.
// todo 如果是 pyflink 的命令入口
if (ProgramOptionsUtils.isPythonEntryPoint(commandLine)) {
// todo 组装 pyflink 所需要的依赖配置
programOptions = ProgramOptionsUtils.createPythonProgramOptions(commandLine);
effectiveConfiguration =
getEffectiveConfiguration(
activeCommandLine,
commandLine,
programOptions,
Collections.emptyList());
} else {
// todo 组装非pyflink 程序的配置
programOptions = new ProgramOptions(commandLine);
programOptions.validate();
final URI uri = PackagedProgramUtils.resolveURI(programOptions.getJarFilePath());
effectiveConfiguration =
//todo 主要是做了将命令行中的配置覆盖 从 confDir 中读取的默认配置
getEffectiveConfiguration(
activeCommandLine,
commandLine,
programOptions,
Collections.singletonList(uri.toString()));
}
final ApplicationConfiguration applicationConfiguration =
new ApplicationConfiguration(
programOptions.getProgramArgs(), programOptions.getEntryPointClassName());
// todo 部署应用
deployer.run(effectiveConfiguration, applicationConfiguration);
}
在 runApplication 方法中,程序进行了命令行对象的组装,程序运行配置的组装,然后进行任务提交,继续跟踪 deployer.run(effectiveConfiguration, applicationConfiguration);
发现在run 方法中,获取了一个集群描述器,然后进行了应用部署

由于是采用的yarn application 模式,因此使用 YarnClisterDescriptor,进入到 deployApplicationCluster 方法中,可发现 其继续进行了 部署模式校验,任务jar 的校验 、配置应用等操作,最后向集群执行 部署

在部署 flink 任务到 yarn 上时,入口程序指定的是 YarnApplicationClusterEntryPoint.class.getName()
根据 deployInternal 方法的调用,可以发现,在 yarn application 模式下,部署并未传入 jobGraph ,此处也能说明,yarn application 的 流图生成是在 AM 容器中完成的
在 deployInternal 方法中,执行了大量的校验工作,比如进行了 Kerberos 认证校验,yarn 的资源校验, yarn 的队列校验等等,一切校验通过后,就开始创建AM 容器

在创建AM 容器时,flink 进行了文件系统初始化 ,构造了 一个资源上传器,用于进行依赖的lib 包,配置文件的上传,上传能完成以后,设置了这些资源的classpath 信息,然后构造了AM 启动命令,由于yarn application 模式的启动入口传入的是YarnApplicationClusterEntryPoint,因此在构造 AM 中启动时运行的是 YarnApplicationClusterEntryPoint 的main 方法, 最后进行了 AM 容器提交




至此,flink 的任务终于提交到yarn 上,并开始创建AM 容器了
具体AM 容器中都干了些啥,咱们下回再说
Flink1.13.1源码解析-Application on yarn(一)的更多相关文章
- [源码解析] 深度学习分布式训练框架 horovod (13) --- 弹性训练之 Driver
[源码解析] 深度学习分布式训练框架 horovod (13) --- 弹性训练之 Driver 目录 [源码解析] 深度学习分布式训练框架 horovod (13) --- 弹性训练之 Driver ...
- [源码解析] PyTorch 分布式(13) ----- DistributedDataParallel 之 反向传播
[源码解析] PyTorch 分布式(13) ----- DistributedDataParallel 之 反向传播 目录 [源码解析] PyTorch 分布式(13) ----- Distribu ...
- Java 集合系列13之 WeakHashMap详细介绍(源码解析)和使用示例
概要 这一章,我们对WeakHashMap进行学习.我们先对WeakHashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用WeakHashMap.第1部分 WeakHashMap介绍 ...
- Spring-cloud & Netflix 源码解析:Eureka 服务注册发现接口 ****
http://www.idouba.net/spring-cloud-source-eureka-client-api/?utm_source=tuicool&utm_medium=refer ...
- android源码解析(十七)-->Activity布局加载流程
版权声明:本文为博主原创文章,未经博主允许不得转载. 好吧,终于要开始讲讲Activity的布局加载流程了,大家都知道在Android体系中Activity扮演了一个界面展示的角色,这也是它与andr ...
- Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...
- OKHttp源码解析
http://frodoking.github.io/2015/03/12/android-okhttp/ Android为我们提供了两种HTTP交互的方式:HttpURLConnection 和 A ...
- 异步任务spring @Async注解源码解析
1.引子 开启异步任务使用方法: 1).方法上加@Async注解 2).启动类或者配置类上@EnableAsync 2.源码解析 虽然spring5已经出来了,但是我们还是使用的spring4,本文就 ...
随机推荐
- Linux常用命令学习笔记——基于CentOS 7
前言:最近在linux培训时复习了一下linux系统中一些常用的命令和用法,整理成了笔记,虽然些许零散,但希望对大家有所帮助. 目录 0.帮助指令 1.关机.重启.注销命令 2.文件和目录操作命令 3 ...
- wireshark、tcpdump使用笔记
最近使用wireshark抓包icmp协议,过滤的命令如下所示: ip.addr eq 192.168.20.54 and ip.addr eq 192.168.50.131 and (icmp) 如 ...
- 3.3 常用Linux命令
1.pwd命令 pwd命令用于显示用户当前所处的工作目录 2.cd命令 cd命令用于切换当前的工作路径,英文全称为"change directory",语法格式为"cd ...
- 单列集合(Collection-List)
与数组的区别 ArrayList while循环快捷键itit 遍历方法2:增强for循环 快捷键大写的I List接口(少部分常用的) List三种遍历方式 注意事项 ArrrayList底层结构和 ...
- umi框架应用服务端SSR,实现数据预渲染
当我们的应用使用服务端渲染的方式时,可能需要把初始化加载的数据例如推荐等不需要用户输入的内容直接渲染获取,也有利于SEO. 上一篇已经实现服务端渲染,本次实现服务端获取数据后在做渲染. 利用getIn ...
- Metalama简介5.配合VisualStudio自定义重构或快速操作功能
使用基于Roslyn的编译时AOP框架来解决.NET项目的代码复用问题 Metalama简介1. 不止是一个.NET跨平台的编译时AOP框架 Metalama简介2.利用Aspect在编译时进行消除重 ...
- 优化 Docker 镜像大小常见方法
平时我们构建的 Docker 镜像通常比较大,占用大量的磁盘空间,随着容器的大规模部署,同样也会浪费宝贵的带宽资源.本文将介绍几种常用的方法来优化 Docker 镜像大小,这里我们使用 Docker ...
- 你不知道的 Linux 使用技巧
开源Linux 一个执着于技术的公众号 1.快速跳转命令 - z 要是每次都要进入一个目录很深的文件夹下,像下面这样: # cd /root/py/auto/fabric 每次都要输入好多个目录名是不 ...
- WinUI3开发笔记(Ⅱ)
WinUI3中的"MessageBox.Show()" # (一,如何实现) "开发WinUI3,第一个不适就是消息弹窗!" WinUI中没有C#.NetFra ...
- 好客租房25-react中的事件处理(事件对象)
3.2事件对象 可以通过事件处理程序的参数 React中的事件对象叫做:合成事件(对象) 合成事件:兼容所有浏览器 //导入react import React from 'react' ...