调度器是YARN的一种可插拔的组件,可根据不同的需求选择调度器(Scheduler)。调度器可以在yarn-default.xml中设置关于调度器的信息,并可以在ResourMananger的WebUI的界面左侧集群菜单中的调度选项中找到调度信息(图在文章最下面)。
FIFO调度器
FIFO调度是一种“先进先出”、“先来先服务”的调度,先来的工作队列先被拉取,不考虑作业的优先级和范围,也可以说是作业一个一个完成。FIFO调度适合低负载集群。一种比较基本的调度器,
Capacity调度器
Capacity调度器(容量调度器)允许多个组安全地共享一个大规模集群。它的很多概念都是直接从第一版Hadoop的CapacityTask-Scheduler继承而来。为了使用Capacity调度器,管理员使用处理器容量的预定值配置一个或多个队列(queue)。这种分配保证了每个队列的最小资源使用量。管理员为每个队列的可用资源容量配置了软限制和可选的硬限制。每个队列有严格的ACL(访问控制列表),用以控制那些用户可以向各个队列提交作业。
Capacity调度器共享集群,同时给每个用户或组一定的最小容量保证。这些最小值在不需要时可以放弃,超出的容量将会给予那些最饥饿的队列,其中饥饿程度用运行中或者已用的队列衡量。初始的最小容量保证所定义的最满队列将获得最需要的资源(这个涉及到作业如何分配到队列以及饥饿程度如何衡量)。空闲容量可以被分配,并以最具成本效益的弹性方式提供给用户。空闲容量被分配的简单理解就是队列中有空出的资源,可以完成小的作业,这样的缺点是,若没有小的作业可以使用这部分资源,这个资源就会一直被占用(空闲又无人使用),造成资源浪费。对于Capacity调度器,可以配置一个专门的队列用来运行小任务,但是为小任务专门设置一个队列会预先占用一定的集群资源。
队列的定义和属性(例如容量、ACL)可以由管理员以安全的方式,在运行时更改,以尽量减少对用户的干扰。管理员可以在运行时添加额外队列,但队列不能在运行中删除。
Capacity调度器根据来自NodeManager的信息,将Container放到最适合的节点上。当工作负载可以预见的情况下,Capacity调度器效果最好,因为这有助于分配最小容量。要使调度器有效工作,需要为每个队列分配小于最高预期负载的最小容量。在每个队列内部,使用层次化的FIFO来调度多个应用程序,类似于在独立的FIFO调度其中使用的方式。
Fair调度器
Fair调度器(公平调度器)将资源公平分配给应用,使得所有应用在平均的情况下随着时间得到相等的资源份额。
在Fair调度中,YARN Container的分配是选择使用最少资源的队列。默认配置下,所有用户共享一个被称为“default”的队列。如果一个作业在Container资源请求中指定了队列,则将请求提交到队列中。Fair调度器也可以根据据请求中包含的用户名来分配队列。Fair调度器还有其他配置,例如队列的权重(权重大的获得的Container多)、最小份额、最大份额、队列内的FIFO策略。
在Fair调度器下,如果单个作业正在运行,该作业可以请求整个集群资源,也可以不请求全部资源(Capacity不可以这样)。若有其他作业提交,空闲资源会被Fair分配给新的作业,并使每个应用程序获得大致相当的资源(默认下)。Fair调度器支持抢占,可以从ApplicationMaster要回Container。即当单个作业运行时,该作业获得了所有集群资源,当有另一个作业提交后,调度器会要回Container并分配适当的资源给这个作业(要回的在将来被分配的资源的多少取决于作业的大小,公平起见)。在这个过程中后面提交的任务获得资源会有一定延迟,因为需要等待前面任务的Container被ApplicationMaster要回。
Fair调度器与Capacity调度器不同的一点就是,Fair调度器不需要事先占用一定的资源,它根据提交的作业动态调整系统资源。
若想更详细的了解YARN可以参考Hadoop YARN权威指南这本书。
下面可以看每个节点container的数量
下面查看每个队列资源的使用量,只有default队列,父队列是root队列,可以了解一下capacity的层级队列