YARN(Yet Another Resource Negotiator)是Hadoop的集群资源管理系统。YARN提供请求和使用集群资源的API,但这些API不多直接用于用户代码。相反,用户代码中用的是分布式计算框架提供的更高层API,这些API创建在YARN之上且向用户隐藏了资源管理细节。node
YARN经过两类长期运行的守护进程提供本身的核心服务:管理集群上资源使用的资源管理器(resource manager)、运行在集群中全部节点上且可以启动和监控容器(container)的节点管理器(node manager)。容器用于执行特定应用程序的进程,每一个容器都有资源限制(内存、CPU等)。一个容器能够是一个Unix进程,也能够是一个Linux cgroup,取决于YARN的配置。服务器
YARN应用运行机制示意图以下:架构
首先,客户端联系资源管理器,要求它运行一个application master进程(1)。而后,资源管理器找到一个可以在容器中启动application master的节点管理器(2a & 2b)。application master运行起来后作什么依赖于应用自己。多是在所处的容器中简单地运行一个计算,并将结果返回给客户端;或是向资源管理器请求更多的容器(3),以用于运行一个分布式计算(4a & 4b)。app
YARN自己不会为应用的各部分(客户端、master和进程)彼此间通讯提供任何手段。大多数重要的YARN应用使用某种形式的远程通讯机制来向客户端传递状态更新和返回结果,可是这些通讯机制都是专属于各应用的。框架
YARN有一个灵活的资源请求模型。当请求多个容器时,能够指定每一个容器须要的计算机资源数量(内存和CPU),还能够指定对容器的本地限制要求。YARN容许一个应用为所申请的容器指定本地限制。本地限制可用于申请位于指定节点或机架,或集群中任何位置的容器。分布式
有时本地限制没法被知足,这种状况下要么不分配资源,或者可选择放松限制。例如,一个节点因为已运行了别的容器而没法再启动新的容器,这时若是有应用请求该节点,则YARN将尝试在同一机架中的其余节点上启动一个容器,若是还不行,则会尝试集群中的任意一个节点。ide
YARN应用能够在运行中的任意时刻提出资源申请。例如,能够在最开始提出全部的请求,或者为了知足不断变化的应用须要,采起更为动态的方式在须要更多资源时提出请求。Spark采用第一种方式,在集群上启动固定数量的执行器;MapReduce则分两步走,在最开始的时候申请map任务容器,reduce人去容器的启用则放在后期。oop
YARN应用生命周期差别性很大,因此按照应用到用户运行的做业之间的映射关系对应用分类更有意义。spa
① 一个用户做业对应一个应用(MapReduce);blog
② 做业的每一个工做流或每一个用户对话对应一个应用(Spark);
③ 多个用户共享一个长期运行的应用,做为一种协调者的角色运行(Apache Slider、Impala)。
MapReduce 1中,有两类守护进程控制着做业执行过程:一个jobtracker及一个或多个tasktracker。jobtracker经过调度tasktracker上运行的任务来协调全部运行在系统上的做业。tasktracker在运行任务的同时将运行进度报告发送给jobtracker,jobtracker由此记录每项做业任务的总体进度状况。若是其中一个任务失败,jobtracker能够在任何一个tasktracker节点上从新调度该任务。
MapReduce 1和YARN组成比较以下:
MapReduce 1 |
YARN |
Jobtracker |
资源管理器、application master、时间轴服务器 |
TaskTracker |
节点管理器 |
Slot |
容器 |
YARN能够在更大规模的集群上运行。因为jobtracker必须同时管理做业任务和任务,当节点数达到4000、任务数达到40000时,MapReduce 1会遇到可扩展性瓶颈。YARN利用资源管理器和application master分离的架构优势克服了这个局限性,能够扩展到面向将近10000个节点和100000个任务。
MapReduce 1中,每一个tasktracker都配置有若干固定长度的slot,这些slot时静态分配的,在配置的时候就被划分为map slot和reduce slot。一个map slot仅能用于运行一个map任务,一样,一个reduce slot仅能用于运行一个reduce任务。
YARN上,一个节点管理器管理一个资源池,而不是指定的固定数目的slot。YARN上运行的MapReduce不会出现因为集群中仅有map slot可用致使reduce任务必须等待的状况。YARN中的资源时精细化管理的,这样一个应用可以按需请求资源,而不是请求一个不可分割的、对于特定的任务而言可能会太大或过小的slot。
YARN向MapReduce之外的其余类型的分布式应用开放了Hadoop。用户甚至能够在同一个YARN集群上运行不一样版本的MapReduce。
YARN调度器的工做是根据既定策略为应用分配资源。YARN中有三种调度器可用:FIFO调度器、容量调度器、公平调度器。
FIFO调度器将应用放置在一个队列中,而后按照提交的顺序运行应用,优势是简单易懂不须要任何配置,可是不适合共享集群。
使用容量调度器时,一个独立的专门队列保证小做业一提交就能够启动,因为队列容量是为那个队列中的做业所保留的,所以这种策略是以整个集群的利用率为代价的。
使用公平调度器时,不须要预留必定量的资源,由于调度器会在全部运行的做业之间动态平衡资源,既获得了较高的集群利用率,又能保证小做业能及时完成。
在一个繁忙的集群上,若是一个应用请求某个节点,那么极有可能此时有其余容器正在该节点上运行。此时若是等待一小段时间,可以增长在所请求的节点上分配到一个容器的机会,从而能够提升集群的效率。这个特性称为延迟调度。容量调度器和公平调度器都支持延迟调度。
当使用延迟调度时,调度器不会简单的使用它收到的第一个调度机会,而是等待、设定的最大数目的调度机会发生,而后才放松本地性限制并接收下一个调度机会。
YARN中调度器解决公平性的思路是,观察每一个用户的主导资源,并将其做为对集群资源使用的一个度量(称为主导资源公平性 DRF),默认状况下不用DRF。