YARN 是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统。可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大优点。
YARN最初是为了修复MapReduce实现里的明显不足,并对可伸缩性(支持一万个节点和二十万个内核的集群)、可靠性和集群利用率进行了提升。YARN实现这些需求的方式是,把Job Tracker的两个主要功能(资源管理和作业调度/监控)分成了两个独立的服务程序——全局的资源管理(RM)和针对每一个应用的应用 Master(AM)。这样一个应用要么是传统意义上的MapReduce任务,要么是任务的有向无环图(DAG)。
YARN从某种那个意义上来说应该算做是一个云操作系统,它负责集群的资源管理。在操作系统之上能够开发各类的应用程序,比如批处理MapReduce、流式作业Storm以及实时型服务Storm等。这些应用能够同一时候利用Hadoop集群的计算能力和丰富的数据存储模型,共享同一个Hadoop 集群和驻留在集群上的数据。
此外,这些新的框架还能够利用YARN的资源管理器,提供新的应用管理器实现。
yarn总体上是master/slave结构,主要由ResourceManager、NodeManager、ApplicationMaster和Container等几个组件组成。
2.1 RM
RM 是一个全局的资源管理器,负责整个系统的资源管理和分配,它主要由两个部分组成:调度器(Scheduler)和应用程序管理器(Application Manager)。
调度器根据容量、队列等限制条件,将系统中的资源分配给正在运行的应用程序,在保证容量、公平性和服务等级的前提下,优化集群资源利用率,让所有的资源都被充分利用。
应用程序管理器负责管理整个系统中的所有的应用程序,包括应用程序的提交、与调度器协商资源以启动ApplicationMaster、监控ApplicationMaster运行状态并在失败时重启它。
2.2 AppMaster
用户提交的一个应用程序会对应于一个ApplicationMaster,它的主要功能有:
a.与RM 调度器协商以获得资源,资源以Container 表示。
b.将得到的任务进一步分配给内部的任务。
c.与NM 通信以启动/停止任务。
d.监控所有的内部任务状态,并在任务运行失败的时候重新为任务申请资源以重启任务。
2.3 NodeManager
NodeManager 是每个节点上的资源和任务管理器,一方面,它会定期地向RM 汇报本节点上的资源使用情况和各个Container 的运行状态;另一方面,他接收并处理来自AM 的Container 启动和停止请求。
2.4 Container
Yarn中的资源抽象,它封装了某个节点上的多维度资源,如内存,CPU,磁盘,网络等。AppMaster向NodeManager申请资源的时候,资源是以container的形式表示的。一个应用程序会分配一个Container,这个应用程序只能使用这个Container 中描述的资源。不同于MapReduceV1 中槽位slot 的资源封装,Container 是一个动态资源的划分单位,更能充分利用资源。
1、FIFO 调度模式的基本原理、优点和缺点?
基本原理:按照先后顺序决定资源的使用,资源优先满足最先来的 job。第一个 job 优先获 取所有可用的资源,接下来第二个 job 再获取剩余资源。以此类推,如果第一个 job 没有占 用所有的资源,那么第二个 job 还可以继续获取剩余资源,这样多个 job 可以并行运行,如 果第一个 job 很大,占用所有资 源,则第二 job 就需要等待,等到第一个 job 释放所有资源。
优点和缺点:
1)适合长作业,不适合短作业,
2)适合 CPU 繁忙型作业(计算时间长,相当于 长作业),不利于 IO 繁忙型作业(计算时间短,相当于短作业)
2、FAIR 调度模式的优点和缺点?
所有的任务拥有大致相当的优先级来共享集群资源,spark 多以轮训的方式为任务分配资 源,不管长任务还是短任务都可以获得资源,并且获得不错的响应时间,对于短任务,不会 像 FIFO 那样等待较长时间了,通过参数 spark.scheduler.mode 为 FAIR 指定.
3、CAPCACITY 调度模式的优点和缺点?
原理:容量调度器支持多个队列,每个队列可配置一定的资源量,每个队列采用 FIFO 调度策 略,为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占 资源量进行限定。调度时,首先按以下策略选择一个合适队列:计算每个队列中正在运行的 任务数与其应该分得的计算资源之间的比值(即比较空闲的队列),选择一个该比值最小的队 列;然后按以下策略选择该队列中一个作业:按照作业优先级和提交时间顺序选择,同时考 虑用户资源量限制和内存限制。
优点:
(1)计算能力保证。支持多个队列,某个作业可被提交到某一个队列中。每个队列会配置一 定比例的计算资源,且所有提交到队列中的作业共享该队列中的资源。
(2)灵活性。空闲资源会被分配给那些未达到资源使用上限的队列,当某个未达到资源的队 列需要资源时,一旦出现空闲资源资源,便会分配给他们。
(3)支持优先级。队列支持作业优先级调度(默认是 FIFO)
(4)多重租赁。综合考虑多种约束防止单个作业、用户或者队列独占队列或者集群中的资源。
(5)基于资源的调度。 支持资源密集型作业,允许作业使用的资源量高于默认值,进而可 容纳不同资源需求的作业。不过,当前仅支持内存资源的调度。
YARN ResourceManager 的高可用与 HDFS NameNode 的高可用类似,但是 ResourceManager 不像 NameNode ,没有那么多的元数据信息需要维护,所以它的状态信息可以直接写到 Zookeeper 上,并依赖 Zookeeper 来进行主备选举。
Yarn最主要的功能就是解决运行的用户程序与yarn框架完全解耦。
Yarn上可以运行各种类型的分布式运算程序(mapreduce只是其中的一种),比如mapreduce、storm程序,spark程序……
作业提交全过程详解
作业提交
第1步:client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。
第2步:client向RM申请一个作业id。
第3步:RM给client返回该job资源的提交路径和作业id。
第4步:client提交jar包、切片信息和配置文件到指定的资源提交路径。
第5步:client提交完资源后,向RM申请运行MrAppMaster。
作业初始化
第6步:当RM收到client的请求后,将该job添加到容量调度器中。
第7步:某一个空闲的NM领取到该job。
第8步:该NM创建Container,并产生MRAppmaster。
第9步:下载client提交的资源到本地。
任务分配
第10步:MrAppMaster向RM申请运行多个maptask任务资源。
第11步:RM将运行maptask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。
任务运行
第12步:MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动maptask,maptask对数据分区排序。
第13步:MrAppMaster等待所有maptask运行完毕后,向RM申请容器,运行reduce task。
第14步:reduce task向maptask获取相应分区的数据。
第15步:程序运行完毕后,MR会向RM申请注销自己。
进度和状态更新
YARN中的任务将其进度和状态(包括counter)返回给应用管理器, 客户端每秒(通过mapreduce.client.progressmonitor.pollinterval设置)向应用管理器请求进度更新, 展示给用户。
作业完成
除了向应用管理器请求作业进度外, 客户端每5分钟都会通过调用waitForCompletion()来检查作业是否完成。时间间隔可以通过mapreduce.client.completion.pollinterval来设置。作业完成之后, 应用管理器和container会清理工作状态。作业的信息会被作业历史服务器存储以备之后用户核查。
资料来源