一、Yarn架构
Yarn架构设计也是主从架构,分为Resource Manager(RM)和Node Manager(NM),其中RM主要负责应用管理和资源调度,NM主要负责容器和作业。
1、Yarn架构介绍
ResourceManager(RM):
负责对各个Node Manager(NM)上的资源进行统一管理和调度,将ApplicationMaster(AM)分配空闲的Container运行并监控其运行状态。对AM申请的资源请求分配相应的空闲Container。主要由两个组件构成:调度器(Scheduler)和应用程序管理器(Application Manager)。
调度器(Scheduler):调度器根据容量、队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统中的资源分配给各个正在运行的应用程序。调度器仅根据各个应用程序的资源需求进行资源分配,而资源分配单位是Container,从而限定每个任务使用的资源量。Scheduler不负责监控或者跟踪应用程序的状态,也不负责任务因为各种原因而需要的重启(由ApplicationMaster负责)。总之,调度器根据应用程序的资源要求,以及集群机器的资源情况,为用程序分配封装在Container中的资源。
应用程序管理器(Application Manager):应用程序管理器负责管理整个系统中所有应用程序,包括应用程序提交、与调度器协商资源以启动AM、监控AM运行状态并在失败时重新启动等,跟踪分给的Container的进度、状态也是其职责。
NodeManager(NM):
NM是每个节点上的资源和任务管理器。它会定时地向RM汇报本节点上的资源使用情况和各个Container的运行状态;同时会接收并处理来自Application Master的Container启动/停止等请求。
ApplicationMaster(AM)::
用户提交的应用程序均包含一个AM,负责应用的监控,跟踪应用执行状态,重启失败任务等。ApplicationMaster是应用框架,它负责ResouceManager协调资源,并且与NodeManager协同工作完成Task的执行和监控。MapReduce就是原生支持的一种框架,可以在YARN上运行MapReduce作业。有很多分布式应用都开发了对应的应用程序框架,用于在YARN上运行任务,例如:Spark,Storm等。如果需要,我们也可以自己写一个符合规范的YARN application。Container:是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当AM向RM申请资源时,RM为AM返回的资源便是用Container 表示的。 YARN会为每个任务分配一个Container且该任务只能使用该Container中描述的资源。
二、YARN常用命令
1、查看YARN命令
a、进入hadoop程序目录中的bin目录
b、查看yarn所有命令
yarn
2、查看正在运行的任务
hadoop/bin]$yarn application -list
PS:application_1528463812366_0001,查询的数字1528463812366代表long型下的时间数值
3、杀掉正在运行的任务
yarn application -kill 任务id
例:yarn application -kill application_1528463812366_0001
三、YARN三种调度器
在YARN中,负责应用资源分配的是Schedule(调度器),对于调度,其本身就是一个难题。在YARN中提供了三种可以选择的调度器:
FIFO Schedule
Capacity Schedule
FairSchedule
其对比图如下所示:
FIFO Scheduler:可称为队列调度器,简单的理解就是所提交 的job一个一个完成。
Capacity Scheduler(默认):简单理解就是会额外空出一部分资源,专门用于完成一些小的Job,但是若没有相关任务,则这个资源就会一直占有,容易造成资源浪费。
Fair Scheduler:一般情况下,调度器选择这种调度方式,简单理解就是我一个JOB占用全部资源工作,若有小的JOB进来,就释放一定的资源去完成小Job,小Job完成后,大Job继续占用,一般不会产生资源浪费。(ps:小Job提交后需要等待一定时间,等待大Job释放资源)。
四、YARN执行流程
1、用户向YARN中提交应用程序,其中包括ApplicationMaster程序、启动ApplicationMaster命令、用户程序等
2、resourceManager为该应用程序分配第一个container,并与对应的nodeManager通信,要求它在这个container中启动应用程序的ApplicationMaster
3、ApplicationMaster首先向ResourceManager注册,这样用户可以直接通过ResourceManager查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复4~7
4、ApplicationMaster采用轮询的方式通过RPC协议向resourceManager申请和领取资源
5、一旦ApplicationMaster申请到资源后,便与对应的Nodemanager通信,要求它启动任务。
6、NodeManager为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务
7、各个任务通过某个RPC协议向ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过RPC向ApplicationMaster查询应用程序的当前运行状态
8、应用程序运行完成后,ApplicationMaster向resourceManager注销并关闭自己
1.客户端提交应用程序给ResourceManager
2.ResouceManager会生成ApplicationMaster,并在某一个节点服务器上
运行ApplicationMaster
3.ApplicationMaster向ResourceManger注册其信息,并且向ResourceManger发送
申请资源报告,申请contaniner容器,以运行application下的任务
(其实是每个container容器被分配后,由每个机器上的nodemanger来启动该container)
4.在运行过程中,由applicationMaster来运行和管理container里面的任务
其中container会通过心跳机制向applicationMaster来发送运行信息。
5.任务完成之后,application向ResourceManager报告,任务完成,container进行资源释放。
>>集群资源的管理
主节点 -RM ResourceManager
通过节点服务器定期向主节点报告使用情况
从节点 -ND NodeManager
通过自己的进程管理每一个节点服务其的使用情况
>>任务调度
>>>yarn上运行多个应用程序
>>>应用程序运行需要资源
>>>对应用程序的资源如何进行分配
>>>yarn如何任务调度
resourcemanager
>>>处理客户端请求
>>>启动/监控applicationmaster
>>>监控nodemanger
>>>资源分配与调度
nodemanger
>>>单个节点管理
>>>处理来自resourcemanger的命令
因为resourcemanager需要指定一个datanode来运行applicationmaster
需要划分空间,运行任务
>>>处理来在applicationmaster的命令
因为applicationmaster需要请求nodemanger来启动其下划分的container中的任务
applicationMaster
>>>申请资源
>>>监控、管理nodemanger上的任务运行情况
container
对资源抽象和封装,目的是为了让每个应用程序对应的任务完成执行
任务之间不能相互影响,任务不能相互交叉使用和共享
五、YARN三种调度策略比较
1、FIFOScheduler
FIFO Scheduler把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求满足后再给下一个分配,以此类推。
FIFO Scheduler是最简单也是最容易理解的调度器,也不需要任何配置,但它并不适用于共享集群。大的应用可能会占用所有集群资源,这就导致其它应用被阻塞。在共享集群中,更适合采用Capacity Scheduler或Fair Scheduler,这两个调度器都允许大任务和小任务在提交的同时获得一定的系统资源。
缺点:
耗时长的任务会导致后提交的一直处于等待状态,资源利用率不高;当集群多人共享,显然不合理,不适合共享集群,共享集群更适合采用Capacity Scheduler或Fair Scheduler
2、CapacityScheduler
对于Capacity调度器,有一个专门的队列用来运行小任务,但是为小任务专门设置一个队列会预先占用一定的集群资源,这就导致大任务的执行时间会落后于使用FIFO调度器时的时间。
3、Fair Scheduler
在Fair调度器中,我们不需要预先占用一定的系统资源,Fair调度器会为所有运行的job动态的调整系统资源。当第一个大job提交时,只有这一个job在运行,此时它获得了所有集群资源;当第二个小任务提交后,Fair调度器会分配一半资源给这个小任务(比如当前集群只有一个任务A,那么A拥有整个集群资源,这时候又提交了一个任务B,这时候任务A和B平分资源),让这两个任务公平的共享集群资源。需要注意的是,在Fair调度器中,从第二个任务提交到获得资源会有一定的延迟,因为它需要等待第一个任务释放占用的Container。小任务执行完成之后也会释放自己占用的资源,大任务又获得了全部的系统资源。最终的效果就是Fair调度器即得到了高的资源利用率又能保证小任务及时完成。