Hadoop学习之路 --- YARN(资源管理系统)

Apache YARN(Yet Another Resource Negotiator的缩写)是Hadoop的集群资源管理系统。YARN被引入Hadoop2,最初是为了改善MapReduce的实现,但它具有足够的通用性,同样可以支持其他的分布式计算模式。

                                                                                                                                                  ----<<Hadoop权威指南>>

名词解释:

  • 什么是YARN:

集群资源管理系统,即可以管理集群中所有机器的资源(如cpu,内存),让集群中的资源可以为同一个任务发挥作用,从而达到加快任务处理速度的目的。即当要处理一个大数据任务时,由HDFS使得数据块分布不同机器上,然后由YARN分配每台机器处理其相应数据块所需的资源,并监视其处理。

  • 什么是Scheduler(调度器):

Scheduler即调度器,根据容量、队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统中的资源分配给各个正在运行的应用程序。

 

首先是YARN的几个比较大的特点:

1.可扩展性:

由于 MapReduce1 总的 jobtracker 必须同时管理作业调度和任务跟踪,当集群的规模超过一 定程度(比如节点数超过 4000,任务数超过 40000),MapReduce1 就会遇到扩展瓶颈。而在 YARN 中,作业调度由ResourceManager 负责,任务的跟踪由 NodeManager 中的 Application Master 负责。YARN 利用资源管理器与Application Master 分离的架构解决 了这个局限,可以扩展到近 10000 个节点和 100000 个任务。

 

2.可用性:

由于 MapReduce1 中的 jobtracker 内存中包含大量快速变化的负责状态(比如任务的执行状态),这使得改进jobtracker 让其具有高可用非常困难。但 YARN 中将作业调度和跟踪职责划分之后,就变成了分别对资源管理器和 YARN 应用的高可用,而对ResourceManager 高可用和 YARN 应用的高可用要容易得多。

 

3.利用率:

MapReduce1 中为每个 tasktracker 分配的 slot 是固定长度的,而且区分了 map slot 和 reduce slot,这会导致两者任务不匹配的时候,其中的一类 slot 空闲,利用率不足。而 YARN 中,一个节点管理器管理一个资源池,而不是固定数目的 slot。不会出现 MapReduce1 中的情况。

 

4.多租户:

YARN 不仅仅适用于 MapReduce,它对外开放了 Hadoop,可以在 YARN 上运行包括 MapReduce1、MapReduce2 以及其他应用,如 Spark 等。

 

YARN的组成:

YARN 按功能可分为资源管理器和任务的调度与监控,并将它们分别纳入两个独立的守护进程,YARN通过两类长期运行的守护进程提供自己的核心服务ResourceManager(资源管理器)和NodeManager(节点管理器)组成。基本思想为一个全局的 ResourceManager 和每个应用节点运行一个 NodeManager。

ResourceManager的组成:

ResourceManager由Scheduler(调度器)和 ApplicationsManager(应用程序管理器)组成。

 

各个组件的功能:

ResourceManager:

全权负责整个集群的资源管理。包括应用程序提交、与Scheduler调度器协商资源以启动ApplicationMaster、监控ApplicationMaster运行状态(这里是ApplicationsManager的功能)并在失败时重新启动它等。

 

Scheduler(调度器):

负责资源的调度,它是可插拔的,比如支持 CapacityScheduler,FairScheduler 等。比如ApplicationMaster向ApplicationsManager申请资源时,给多少资源,这就是Scheduler做的事情了。

 

ApplicationsManager(应用程序管理器):

负责接受作业请求,协商第一个 Container 来启动应用特ApplicationMaster,并负责在ApplicationMaster 失败的时候重启(在ApplicationMaster 重启成功前,其各个Container中的Task并不会中断,而是继续执行,执行完成后变等待新任务,在ApplicationMaster重启后,给其分配新任务,之后便继续执行)。每个应用会有一个 ApplicationMaster,它负责向 ResourceManager 的 Scheduler 申请资源,并跟 踪作业的状态和监控整个过程。

 

NodeManager:

负责Container(容器)、监控该节点资源的使用并将它们报告给 ResourceManager 节点。即定时地向ResourceManager 汇报本节点上的资源使用情况和各个Container的运行状态;另一方面,它接收并处理来自ApplicationsManager的Container启动/停止等各种请求。

 

Container:

在任务运行时,在NodeManager节点上会启动一个Container(容器),有时还会被分配启动一个ApplicationMaster。

Container 是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当AM向RM申请资源时,ResourceManager 为ApplicationMaster返回的资源便是用 Container表示的。YARN会为每个任务分配一个Container,且该任务只能使用该Container中描述的资源(怎么分配,那就是ResourceManager中的Scheduler(调度器)的任务了)。Container根据应用程序的需求动态生成的。

ApplicationMaster是每个程序独有的,唯一的,可以说集群中有多少个ApplicationMaster,就有多少个程序在运行(注意,这里说的是程序,也就是完整的一个应用,每一个程序在运行时,是会被分成多个任务,由多个线程乃至多个进程进行处理的)。ApplicationMaster则负责与RM调度器协商以获取资源(用Container表示),将得到的任务进一步分配给内部的任务,与NM通信以启动/停止任务,监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务。

 

 

 

YARN的工作机制:

 大概流程(很多细节忽略):

Client(客户端)将应用提交到ResourceManager,ResourceManager为该应用寻找一个NodeManager节点并建立第一个Container(容器),并启动一个专属于该应用的唯一ApplicationMaster(ApplicationMaster并不在容器内部,二是在其外部),然后根据应用需要,看看是否接着建立更多容器(在其他NodeManager节点上),以便进行分布式计算,计算是在Container(容器)内部完成的,Container(容器)内部会有一个或多个Task(任务)这些任务是由程序拆分而来,通过多线程执行加快其处理速度,当任务完成后,ApplicationMaster就会向ResourceManager注销自己。

 

第一步:MapReduce 客户端程序中的 main中执行 runjob,开始作业;

第二步:客户端程序向 ResourceManager 发送作业请求同时 ResourceManager 将作业 id 以及存放 jar 包的 hdfs 目录返回给客户端;

第三步:客户端会把切片信息、job 的配置信息以及 jar 包上传到上一步收到的 hdfs 目录下(三个文件分别为job.split、job.xml、jar 包);

第四步:客户端应用提交给 RM;

第五步:ResourceManager 将其放入调度器,寻找一个空闲的 NodeManager 创建第一个 Container 容器,并启动 MRAppMaster 进程;

第六步:NodeManager 通过心跳机制接受调度器分配的任务,初始化一个 job;

第七步:MRAppMaster 从 HDSF 中获取需要的数据,如分片信息。这些数据在第三步中存入;

第八步:MRAppMaster 向 RM 申请运行 job 所需的资源,RM 选择一个拥有相应资源的 NodeManager 返回;

第九步:MRAppMaster 告知选中的 NM,启动一个 YarnChild Container 容器;

第十步:YarnChild 从 HDFS 中获取运行 map 和 reduce 任务所需的资源;

第十一步:YarnChild 执行 MapTask 或者 Reduce Tas

 

YARN的Scheduler(调度器):

理想情况下,YARN应用发出的资源请求应该立即给与满足。然而现实中资源是有限的,在一个繁忙的集群上,一个应用经常需要等待才能得到所需的资源。YARN调度器的工作就是根据既定策略为应用分配资源。

                                                                                                                                                       --<<Hadoop权威指南>>

 

YARN提供的三种内置调度器:

FIFO Scheduler(FIFO调度器):

FIFO 为 First Input First Output 的缩写,先进先出。FIFO 调度器将应用放在一个队列中,按照先 后顺序运行应用。这种策略较为简单,但不适合共享集群,因为大的应用会占用集群的所有资源,每个应用必须等待直到轮到自己。

优点:简单易懂,不需要任何配置

缺点:不适合共享集群,大的应用会占据集群中的所有资源,所以每个应用都必须等待,直到轮到自己执行。

  如图所示,只有当job1全部执行完毕,才能开始执行job2

 

Capacity Scheduler(容量调度器):

容量调度器 Capacity Scheduler 允许多个组织共享一个 Hadoop 集群。使用容量调度器时,一个独立的专门队列保证小作业一提交就可以启动。

优点:小任务不会因为前面有大任务在执行,而只能一直等下去

缺点:这种策略是以整个集群利用率为代价的,这意味着与使用FIFO调度器相比,大作业执行的时间要长上一些。

  如图所示,专门留了一部分资源给小任务,可以在执行job1的同时,不会阻塞job2的执行,但是因为这部分资源是一直保留给其他任务的,所以就算只有一个任务,也无法为其分配全部资源,只能让这部分保留资源闲置着,有着一定的资源浪费问题。

 

Fair Scheduler(公平调度器):

公平调度器的目的就是为所有运行的应用公平分配资源。使用公平调度器时,不需要预留一定量的资源,因为调度器会在所有运行的作业之间动态平衡资源,第一个(大)作业启动时,它也是唯一运行的作业,因而获得集群中的所有资源,当第二个(小)作业启动时,它被分配到集群的一半资源,这样每个作业都能公平共享资源。

   如图所示,就像是把好几个任务拼接成了一个任务,可以充分利用资源,同时又不会因为大任务在前面执行而导致小任务一直无法完成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值