Apache Hadoop YARN (Yet Another Resource Negotiator,另一种资源协调者)是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。
YARN是再MRv1发展过来的,它克服了NRv1的各种限制,因此我们先了解一下MRv1
JobTracker:用户程序提交了一个Job,任务(job)会发给JobTracker,JobTracker是Map-Reduce框架中心,它负责把任务分解成map和reduce的作业(task);需要与集群中的机器定时心跳(heartbeat)通信;需要管理那些程序应该跑在那些机器上;需要管理所有job失败、重启操作。
Tasktracker是JobTracker和Task之间的桥梁,Tasktracker可以配置map和reduce的作业操(task slot)。TaskTracker通过心跳告知JobTracker自己还有空闲的作业Slot时,JobTrackr会向其分派任务。它将接收并执行JobTracker的各种命令:启动任务、提交任务、杀死任务。
TaskScheduler工作再JobTracker上。根据JobTracker获得的slot信息完成具体的分配工作,TaskScheduler支持多种策略以提高集群工作效率。
随着互联网的高速发展,新的计算框架不断出现,如内存计算框架、流式计算框架、迭代计算资源框架、这几种框架通常都会被用到考虑到资源的利用率运维和数据共享等因素,企业通常希望将所有的计算框架部署到一个 公共集群中,让他们共享集群的计算资源,并对资源进行同意使用,同时又能采用简单的资源隔离方案,这样便催生了轻量弹性计算平台需求Yarn的设计是一个弹性计算平台,不仅仅支持Mapreduce计算框架而是朝着对多种计算框架进行统一管理方向发展。
资源利利用率高,按照框架角度进行资源划分,往往存在应用程序数据和计算资源需求的不均衡性,使得某段时间内计算资源紧张,而另外一种计算方式的资源空闲,共享集群模式则通过框架共享全部的计算资源,使得集群中的资源更加充分合理的利用。
运维成本低,如果使用:”一个框架一个集群“的模式,运维人员需要独立管理多个框架,进而增加运维的难度,共享模式通常只需要少数管理员可以完成多个框架的管理。
数据共享,随着数据量的增加,跨集群之间的数据不仅增加了硬件成本,而且耗费时间,共享集群模式可以共享框架和硬件资源,大大降低了数据移动带来的成本。
YARN采用了Master/Slave结构,在整个资源管理框架中ResourceManager为master,NodeManager为Slave。ResourceManager负责对各个 NodeManager上的资源进行统一的管理和调度,当用户提交一个应用程序时,需要生成以一个用于追踪和管理这个程序即ApplicationMaster,它负责向ResourceManager申请资源,并要求NodeManager启动可以占用一定的资源任务,不同的ApplicationMaster会被分不到不同的节点上,他们之间是相互独立的。
ResourceManager负责整个系统的资源分配和管理,是一个全局的资源管理器。主要由两个组件构成:调度器和应用管理器。
ApplicationMaster是一个详细的框架库,它结合了ResourceManager获取资源和NodeManager协同工作来运行和监控任务,用户提交的每一个应用程序军包含一个AM,主要的功能是:
MRappMaster是Mapreduce的ApplicationMaster实现,它是的Mapreduce应用程序可以直接在YARN平台之上,MRApplication负责Mappreduce应用的生命周期、作业管理资源申请再分配、container启动与释放、作业恢复等。其他的如计算框架如 Spark on YARN ,Storm on Yarn。如果需要可以自己写一个符合规范的YARN的应用模型。
NM是每个节点上的资源和任务管理器,他会定时地向RM汇报 本节点上地资源使用情况和各个Container地运行状态;同时会接受AM的Container启动/停止等请求。
YARN 资源抽象 ,封存了某个节点是的多维度资源,如内存、CPU、磁盘、网络等。当AM向RM申请资源时,RM为AM返回资源是用Container表示的 。YARN为每一个任务分配给一个Container且该任务只能读取该Container中描述的资源。Container不同于MRv1的slot,他是一个动态划分单位,根据应用程序的需求动态生成的。
一个应用程序可以通过ApplicationMaster请求特定的资源需求来满足它的资源需要。调度器会被分配给一个Container来相应资源需求、用于满足ApplicationMaster在ResourceRequst中提出的要求。Container包含5类信息:优先级、期望资源所在节点、资源量、container数目、松弛本地性(是否没有满足本地资源时,选择机架本地资源)
ResourceRequst包含物种信息:
本质上Container是一种资源分配的形式,是ResourceManager为ResourceRequst成功分配资源的结果。Container授予节点在机器上使用资源(如内存、CPU)的权利,YARN允许的不仅仅是Java的应用程序,概念上Container在YARN分配任务分为两层:第一层为ResourceManage调度器结果分配给用用程序ApplicationMaster,第二层,作为运行环境用ApplicationMaster分配给作业资源。
YARN启动应用程序流程
首先,客户端通知ResourceManager它要提交一个应用程序。随后ResourceManager在应答中返回一个ApplicationId以及必要的客户端请求资源的集群容量信息,资源请求分为两步:1.提交Application请求 2.返回ApplicationID。
3.客户端使用“Application submission Contex”发起响应,Application subminssion上下文包含了ApplicationID、客户名、队列以及其他启动Application所需要的信息。“ContainerLaunch Context”(CLC)也会发送给ResourceManager,CLC提供资源需求、作业文件、安全令牌以及在节点上启动ApplicationMaster所需要的其他信息。应用程序被提交之后,客户端可以向ResourceManager请求结束这个应用或者提供这个应用程序的状态。
4.当ResourceManager接收到客户端的应用提交上下文,它会为ApplcationMaster调度一个可用的Container来启动AM。如果合适的Container,Resource会联系相应的NodeManager并启动ApplicationMaster。如果没有合适的Container,则请求必须等待。ApplicationMaster会发送注册请求到ResourceManager,RM可以通过RPC的方式监控应用程序的状态。在注册请求中,ResourceManager会发送集群的最大和最小的容器容量(第5步),供ApplicationMaster决定如何使用当前集群的可用资源。
基于ResourceMangaer的可用资源信息,ApplicationMaster会请求一定数量的Container(第6步),ResourceManager根据调度政策,尽量为Application分配资源,最为资源请求应答发送给ApplicationMaster(第7步)。
应用启动之后,ApplicationMaster将心跳和进度信息通过心跳发送给ResourceManager,这些心跳中,ApplicationMaster可以请求或释放Container。应用结束时ApplicationMaster发送给结束信息到ResourceManager以注销自己。
ResourceManager已经将分配的NodeManager的控制权移交给ApplicationMaster。ApplicationMaster将独立联系其指定的节点管理器,并提供Container Launch Context,CLC包括环境便利,远程存储依赖文件、以及环境依赖文件,数据文件都被拷贝到节点的本地存储上。同一个节点的依赖文件都可以被同一应用程序Container共享。
一旦所有的Container都启动完成,ApplicationMaster就可以检查他们的状态。ResourceManager不参与应用程序的执行,只处理调度和监控其他资源。ResourceManager可以命令NodeManager杀死Container,比如ApplicationMaster通知ResourceManager自己的任务结束或者时ResourceManager需要为其他应用程序抢占资源。或者Container超出资源限制时都可能发生杀死Container事件。当Container被销毁后,NodeManager会清理它的本地工作目录。 应停用程序结束后,ApplicationMaster会发送结束信号通知ResourceManager,然后ResourceManager通知NodeManager收集日志并清理Container专用文件。如果Container还没退出,NodeManager也可以接收指令去杀死剩余的Container。
简单易懂,不需要任何配置(FIFO Scheduler),容量调度器(Capcity Scheduler)和公平调度器(Fair Scheduler)。FIFO调度器将应用放置在一个队列中然后按照提交的顺序(先进先出)运行应用,首先为队列中的第一个任务请求分配资源。第一个应用的请求被满足后再一次为队列的下一条进行服务。
一个独立的专门队列保证小作业提交就可以启动,由于队列容量是为了那个队列中的作业所保留的。这意味这与使用FIFO调度器相比,大作业执行的事件要长。容量调度器允许多个组织共享一个Hadoop集群,每个组织可以分配到全部集群资源的一部分。每个组织都被配置一个专门的队列,每个队列都被配置为可以使用一定的集群资源。队列可以进一步按层次划分,这样每个组织内的不同用户能够共享该组织队列所分配的资源。在一个队列内,使用FIFO调度政策对应用进行调度。单个作业使用的资源不会超过其队列容量然而,如果队列中由多个作业,并且队列资源不够用,如果仍有可用的空闲资源,那么容量调度器可能会被空余的资源分配给队列的作业,哪怕这超出队列容量。这称之为为“弹性队列”。
Fair调度器是一个队列资源分配方式,在整个时间线上,所有的Job平均的获取资源。默认情况下,Fair调度器知识对内存资源做公平的调度和分配。当集群中只有一个任务运行时,那么此任务会占用整个集群的资源。当其他的任务提交后,那些释放的资源就会被分配给新的Job,所以每个任务最终都能够获取几乎一样多的资源。
调度器 | FIFO | Capcity | Fair |
---|---|---|---|
设计目的 | 最简单的调度器,易于理解和上手。 | 多用户的情况下,最大化集群的吞吐和利用率。 | 多用户的情况下,强调用户公平地贡献资源。 |
队列 组织方式 | d单队列 | 树状组织队列,无论夫队列还是子队列都会由资源参数限制,子队列地资源限制计算是基于父队列地。应用提交到叶子队列。 | 树状组织队列。但是父队列和子队列没有参数继承关系。父队列地资源限制对于子队列没有影响。应用提交到叶子队列。 |
资源限制 | 无 | 父子队列之间有容量关系。每个队列限制了资源使用了,全局最大资源使用了,最大活跃应用数量。 | 每个叶子队列有最小共享量,最大资源量和最大活跃应用了。用户有最大活跃应用数量地全局被指。 |
队列ACL限制 | 可以限制应用提交权限 | 可以限制应用提交权限和队列开关继承,父子队列间地ACL会继承 | 可以限制应用提交权限,父子队列间地ACL会继承。但是由于支持客户端动态创建队列,需要限制默认队列地应用数量。 |
队列排序算法 | 无 | 按照队列地资源使用了最小的优先 | 可以限制应用提交权限,父子队列间的ACL会继承。但是由于支持客户端动态创建队列,需要限制默认队列的应用数量。目前,还看不到关闭动态创建队列的选项。 |
应用选择算法 | 先进先出 | 先进先出 | 公平排序算法排序 |
本地优先分配 | 支持 | 支持 | 支持 |
延迟调度 | 不支持 | 不支持 | 支持 |
资源抢占 | 不支持 | 不支持 | 支持 |
总结: