Yarn资源调度
概述
Yarn是一个资源调度平台,负责为MapReduce运算程序提供服务器运算资源,如果把MapReduce等运算程序看成运行在操作系统上的应用程序,而Yarn相当于一个分布式的操作系统平台;
组成结构如图所示
图中角色的任务介绍如下:
ResourceManager(rm)
处理客户端请求、启动/监控ApplicationMaster、监控NodeManager、资源分配与调度;NodeManager(nm)
单个节点上的资源管理、处理来自ResourceManager的命令、处理来自ApplicationMaster的命令ApplicationMaster(am)
数据切分、为应用程序申请资源,并分配给内部任务、任务监控与容错Container
对任务运行环境的抽象,封装了CPU、内存等多维资源以及环境变量、启动命令等任务运行相关的信息
提交任务工作流程
那么在mapreduce阶段提交作业后,整个平台是怎么运转的呢,我们通过下面这个图来理解;
作业提交
Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业
Client向RM申请一个作业id
RM给Client返回该job资源的提交路径和作业id
Client提交jar包、切片信息和配置文件到指定的资源提交路径
Client提交完资源后,向RM申请运行MrAppMaster
作业初始化
当RM收到Client的请求后,将该job添加到容量调度器中
某一个空闲的NM领取到该Job
该NM创建Container,并产生MRAppmaster
下载Client提交的资源到本地
任务分配
MrAppMaster向RM申请运行多个MapTask任务资源
RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器
任务运行
MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask对数据分区排序
MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask
ReduceTask向MapTask获取相应分区的数据
程序运行完毕后,MR会向RM申请注销自己
进度和状态更新
YARN中的任务将其进度和状态返回给应用管理器, 客户端每秒(通过mapreduce.client.progressmonitor.pollinterval设置)向应用管理器请求进度更新, 展示给用户
作业完成
除了向应用管理器请求作业进度外, 客户端每5秒都会通过调用waitForCompletion()来检查作业是否完成
时间间隔可以通过mapreduce.client.completion.pollinterval来设置。作业完成之后, 应用管理器和Container会清理工作状态
作业的信息会被作业历史服务器存储以备之后用户核查
调度策略
计算机当中的资源有限,一个应用资源的请求经常需要等待一段时间才能得到相应的资源。在yarn中,负责给应用分配资源的是Scheduler,有三种调度器供我们选择。
-
FIFO(先进先出调度器)
这种调度器是将应用按照提交顺序排成一个队列,队列的特性就是先进先出,资源分配是从头开始分配,逐一满足,以此类推。
它不需要任何配置,但它不适用于共享集群。需求大的应用可能会占用所有集群资源,会导致其他应用阻塞。共享集群更适合采用容量调度器或公平调度器。
从图中可以看出,小任务会被大任务阻塞,不适合资源公平性; -
容量调度器(Capacity Scheduler 默认的调度器)
Apache Hadoop默认使用的调度策略。
该调度器有一个专门的队列用来运行小任务,但是为小任务专门设置一个队列会预先占用一定的集群资源,导致大任务的执行时间会比FIFO时间长。
配置:
Capacity 调度器允许多个组织共享整个集群,每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。
除此之外,队列内部又可以垂直划分,这样一个组织内部的多个成员就可以共享这个队列资源了,在一个队列内部,采用的是先进先出(FIFO)策略。
队列资源不足时,可等待其他队列释放的资源或者使用集群中其他空闲资源,使得实际使用的队列容量超出配置的容量,这叫做“弹性队列”。
为队列设置一个最大资源使用量,可以防止队列过多侵占其他队列资源 。
Fair Scheduler(公平调度器,CDH版本的hadoop默认使用的调度器)
设计目标:为所有运行的应用动态地分配公平的资源(对公平的定义可以通过参数来设置);公平调度器也可以在多个队列间工作;
理解如下:
假设用户A,B各自拥有队列Q1,Q2
A先启动一个job J1,则J1占用集群所有资源;
B启动一个job J2,则Q1中的J1需要分一半资源给Q2中的J2;
B又启动一个job J3,则Q2中的J2需要分一半资源给Q2中的J3;
也就是说资源最终在两个用户之间平等的共享;
需要注意的是,在Fair调度器中,从第二个任务提交到获得资源会有一定的延迟,因为它需要等待第一个任务释放占用的Container。
小任务执行完成之后也会释放自己占用的资源,大任务又获得了全部的系统资源。最终的效果就是Fair调度器即得到了高的资源利用率又能保证小任务及时完成。
公平调度器中的队列有一个权重属性,定义权重之后,需要符合权重便被视作公平,没有定义权重,就会平均分配。
每个队列内部仍然可以有不同的调度策略,默认调度策略可以通过顶级元素进行配置,如果没有,默认采用公平调度。
抢占
当一个job提交到一个忙碌集群中的空队列时,job并不会马上执行,而是阻塞知道正在运行的job释放系统资源。为了使该job执行时间更具有预测性,Fair调度器支持抢占。
抢占就是允许调度器杀掉占用超过其应占份额资源队列的containers,它们便可被分配到应享有这些份额资源的队列中。被终止的containers需要被重新执行,所以会降低集群的执行效率。
可以设置队列如果在指定时间内未获得最小的资源保障,调度器会抢占containers。
参考:
1.YARN三种调度器和配置策略
2.Yarn三种调度策略对比
3.YARN资源调度