yarn执行流程

yarn执行流程 

yarn执行流程

 

 

1、Client 向 RM 提交 job 对象申请运行应用程序

2、RM 返回一个运行资源提交地址

3、client 向地址提交切片信息 split,配置文件 xml 和 jar 包等运行资源

4、应答 RM 资源提交完成,并申请运行 appmaster 程序

5、RM 吧 appmaster 放在任务队列里等待空间的 NM 领取任务执行

6、NM 领取任务后创建运行任务的 container 容器虚拟化 cpu 和内存并启动 APPmaster

7、NM 拷贝运行资源到本地,根据 split 计算出 maptask 个数

8、APPmaster 向 RM 申请 maptask 运行资源

9、RM 为 maptask 任务分配运行资源 NM

10、NM 领取任务并创建 container 容器虚拟化 cpu 和内存

11、APPmaster 向领取任务的 NM 发送程序启动脚本

12、NM 分别启动 maptask,APPmaster 监控 maptask 运行情况,当 maptask 运行完成后向 RM 申请容器运行 reducetask

13、reducetask 向 maptask 拉取相应分区的数据计算输出

14、程序运行完毕 APPmaster 向 RM 申请注销自己 

个人总结:

 

客户端和集群

客户端向resucemanage(集群)提交代码,申请运行这个应用程序,

Resucemanage就会返回一个地址(这个地址就是让客户端把要运行的东西

上传到这个地址)

客户端向这个地址上传3个(切片信息split(影响maptask的个数),

配置信息xml(动态更改一些配置参数),jar(要运行谁))提交完成后,

客户端会告诉resucemanager提交完成,来运行这个任务同时

要求申请Applicationmaster,一申请但resucermanage有n多个客户端,不能及时处理,就只能进行排队,也就

形成一个任务,就会把这个任务放入对应的任务队列中,任务队列里就会有

任务,nodemanage就从任务队列里领取任务,nodemanage要运行这个任务就需要资源,

需要资源,那就要有容器contione,contione申请对应的cpu和内存,同时在里面

又启动Applicationmaster,applicationmaster启动之后就会从那个集群地址中读取切片信息,根据切片信息计算出maptaks的个数,applicationmaster向resuocemanager申请maptask所需的资源,申请到后,启动申请到nodenamage中的maptask,resucemanager就会把任务分发给对应nodenamage,nodenamage运行任务同样需要contione容器,虚拟化出cpu和内存。当nodemanage准备完成发送任务之后,Applicationmaster向另外的nodemanager发送启动执行命令,当执行完成之后map阶段就结束,就要运行reduce阶段,reducetask也执行完之后最终把数据写到hdfs上。

程序运行完成后,Applicationmaster向resourcemanage注销自己。

yarn三种调度方式:

fifo ,公平,容量。默认是容量调度器。

Fifo:单队列先进先出同一时间只有一个任务执行

容量调度器:多队列,每个队列当中同一时间只有一个任务执行,它的并发度是队列的个数。

公平调度器:多队列,每个队列当中同一时间多个任务执行,执行条件是谁缺额越多就先执行谁。

在实际开发中怎么选择?对并发度要求比较高就选择公平调度器。