剖析剖析我们的Yarn程序-Client提交

简介: 剖析剖析我们的Yarn程序-Client提交

前面我们把一个 Yarn 程序跑起来了,那么这个Yarn程序都做了些什么呢,这个需要和我们的分布式计算程序说起。所谓分布式程序,也就是把计算量分配到多台机器去运算,这样传统的单机运算的局限就被打破了,还记得我们之前提到的来自 Google 的论文: “Simplified Data Processing on Large Clusters,那里给出了一个分布式程序运行的样子:

图一:谷歌论文中给出的分布式计算

这种分布式计算的方法也成为了我们后面很多分布式计算的规范,后面出现了我们实时计算和基于内存的分布式计算,甚至在我们的  Python  、 Java 、Scala 语言上对集合的操作直接就支持 mapreduce 了。具体的分布式计算中间细节会多一些,但是正因为分布式计算的任务拆分解模式基本都遵循相同的法则,使得分布式计算的调度和资源分配可以统一抽象,这种抽象的工作就由我们的Yarn来完成。

分布式中的程序,计算的工作分布在不同节点中去做,Yarn中我们把计算的任务单元叫做 Container ,对应图中的 Worker ,另外有一个负责 Worker 中作业调度的程序叫做 AppMaster,对于图中的 Master ,整个程序需要从 Yarn 中申请资源,所以我们需要一个客户端 Client 用来提交程序。

下面,我们来体会一下这个过程。我们还需要我们之前的启动命令:

图二:启动一个Yarn程序

 

我们在启动的时候使用了yarn jar这么一项,这个和我们java世界中的java jar类似,不过yarn会帮我们加上依赖的环境变量和类库。后面的出现两次hadoop-yarn-...-cdh5.3.2.jar,第一个jar就是我们的yarn程序包了,这个程序是就是我们开发锅锅完成了一个yarn程序之后的成品了,后面那个呢是我们运行Client之后的参数,这里的org.apcahe....Client就是我们的yarn程序入口了。有了程序的入口,我们自然是想要去了解里面做了什么事情的。我们很机智的去翻一翻源码,看看里面是怎么样子的。

hadoop的源码会随着hadoop一起下载的,里头有个src的文件夹,那就是源码,大概结构是下面这个样子的:

图三:Yarn程序在源码中的样子

 

Hadoop源码比较大的,我们只要把 distributedshell 这部分抠出来,具体就是从maven中剥离一个模块,然后变成一个工程,java开发的宝宝经常干的这种事情。我们把工程导入eclipse:

图四:把源码导入到eclipse中

然后一个麻雀虽小,五脏俱全的小型Yarn程序呈现在我们眼前 ,刚刚不是Client是我们的主入口么,我们进去,一开头便是一片注释,大师们写程序都很严谨,注释很详细,读完注释基本可以了解我们的Client干活的流程了。我们把注释导出doc看一下这内容:

 

图五:源码开头那部分注释

 

小短文很详细告诉我们这个Client的运作过程。首先,我们的 Client 通过 ApplicationClientProtocol RPC请求协议向 ResourceManager 获取集群信息和申请到ApplicationId,这部分我们只是为了提交一个应用做的前期工作,我们需要一个ApplicationId用来标识我们的应用。

第二步呢,对于我们实际需要提交的内容,我们的程序运行命令,这边让这么一个家伙ApplicationSubmissionContext来做,在这个地方我们要对这个应用的详情进行定义,像应用名称啦,applicationID来,优先级啦,还有分到哪个队列啦,大概就是要详细资料。类似银行办业务,先拿号,那个号就是applicationid,然后叫到号就有个业务员和我们打交道,然后我身份证银行卡啥的都要准备好。与此同时我们在这一步还要定义好容器的实现类,也就是我们的     ContainerLaunchContext,他的实例便是我们的Container, 用于给ApplicationMaster程序 运行使用的。

这里要了解一件事情就是我们之前说的Master程序,在yarn环境中也是运行在Container中的,ContainerLaunchContext就是用来运行一个Container的,这个地方准备好ContainerLaunchContext的定义是为我们的Master程序而准备的。在我们这个程序distributedshell定义的内容是本地的资源,配置文件,环境变量之类的以及要在分布式环境上面运行的命令。

接下来的事情,做好准备了就是 用ApplicationSubmissionContext提交我们的应用。提交完成之后,就对应用进行监控,获取应用执行情况的报告,监控方式就是使用ApplicationReport以一定时间频率去获取,万一作业运行花费时间太长,则调用KillApplicationRequest在给定的时间内向ResourceManager执行kill动作。

我们稍微看一下代码:

首先前面400多行代码的样子是获取集群的信息,和申请了applicationid。

图六:申请applicationId

 

接下来的工作是为我们的Master程序申请了一个Container:

 

图七:申请Container逻辑

 

后面陆陆续续把jar包copy到了hdfs,又设置了各种环境变量参数,设置了一堆参数,好吧勤勤恳恳 ,这部分工作是为了然后程序顺利执行。过了这部分呢,我们就终于看到我们的应用被提交了。

图八:提交application

 

终于提交了,最后执行监控。客户端干的活就这么多了。当我们把一个程序用客户端提交之后呢,真正的分布式程序执行,从这里开始。

未完,待续~

目录
相关文章
|
12月前
|
资源调度 JavaScript Windows
yarn install命令运行报错:无法将“yarn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。...
yarn install命令运行报错:无法将“yarn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。...
879 1
yarn install命令运行报错:无法将“yarn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。...
|
2月前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
41 5
|
存储 分布式计算 资源调度
提交MapReduce程序至YARN执行
提交MapReduce程序至YARN执行
113 0
|
XML 资源调度 分布式计算
启动 YARN 并运行 MR 程序|学习笔记
快速学习 启动 YARN 并运行 MR 程序
240 0
启动 YARN 并运行 MR 程序|学习笔记
|
SQL 资源调度 分布式计算
Yarn在全局级别配置调度程序属性
您可以配置调度程序属性来定义所有队列的行为。所有父队列和子队列都继承使用调度程序属性设置的属性。
579 0
Yarn在全局级别配置调度程序属性
|
JSON 资源调度 分布式计算
基于Yarn API的Spark程序监控
一.简述 通过对Yarn ResourceManager中运行程序的状态(RUNNING、KILLED、FAILED、FINISHED)以及ApplicationMaster中Application的Job执行时长超过批次时间的监控,来达到对Spark on Yarn程序的失败重启、超时重启等功能 二.
4913 0