Hadoop系列(二)——灵魂管理者 YARN 详解

YARN 简介

YARN(Yet Another Resource Negotiator)是一个通用的资源管理平台,可为各类计算框架提供资源管理和调度。YARN通过其内部的一个全局资源管理器(ResourceManager,RM),以及每个应用程序对应一个的应用管理器(ApplicationMaster,AM);以Container为单位分配资源为每个应用程序分配一个作业(Job)或者Job的有向无环图(DAG),来达到分离资源管理与作业调度/监控的功能。YARN可以将多种计算框架(如离线处理MapReduce、在线处理的Storm、迭代式计算框架Spark、流式处理框架S4等) 部署到一个公共集群中,共享集群的资源。

Hadoop YARN就好像一个云操作系统灵魂管理者,由一个ResourceManager和多个NodeManager组成。它负责管理所有NodeManger上多维度资源, 并以Container(启动一个Container相当于启动一个主进程)方式分配给应用程序启动ApplicationMaster(相当于开启一个进程) 或运行ApplicationMaster切分的各Task任务(子进程的多线程并发操作)。

YARN 的组件架构

YARN的组件结构如下如所示:

在这里插入图片描述
YARN总体上仍然是Master/Slave结构,在整个资源管理框架中,ResourceManager为Master,NodeManager为Slave,ResourceManager负责对各个NodeManager上的资源进行统一管理和调度。当用户提交一个应用程序时,需要提供一个用以跟踪和管理这个程序的ApplicationMaster,它负责向ResourceManager申请资源,并要求NodeManger启动可以占用一定资源的任务。由于不同的ApplicationMaster被分布到不同的节点上,因此它们之间不会相互影响。

从上图可以看出,YARN主要由ResourceManager(包括ApplicationManager和ResourceScheduler)和NodeManager(包括ApplicationMaster和Container)这两个组件构成。下面分别介绍这两个组件的结构和功能:

ResourceManager

resourcemanager是hadoop YARN全局的资源管理器,也是Global(全局)的主进程。

它的功能如下:

  1. 与客户端进行交互,处理来自于客户端的请求,如查询应用的运行情况等。
  2. 启动和管理各个应用的ApplicationMaster,并且为ApplicationMaster申请第一个Container用于启动和在它运行失败时将它重新启动。
  3. 管理NodeManager(NM),接收来自NodeManager的资源和节点健康情况汇报,并向NodeManager下达管理资源命令,例如kill掉某个container。。RM只接受NM的资源回报信息,对于具体的资源处理则交给NM自己处理。
  4. 资源管理和调度,接收来自ApplicationMaster的资源申请,并且为其进行分配。这个是它的最重要的职能。

RM是一个全局的资源管理器,负责整个系统的资源管理和分配。它主要由两个组件构成:调度器(Scheduler)和应用程序管理器(Applications Manager,ASM)。

Resource scheduler

Resource scheduler是ResourceManager下的调度器,就是说Resource schedule只做根据各个应用程序的资源需求进行资源Container分配这一件事情。它根据容量、队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统中的资源分配给各个正在运行的应用程序。需要注意的是,该调度器是一个“纯调度器”。

常用的调度方法:

  1. FIFO队列
  2. Fair Scheduler公平分配
  3. Capacity Scheduler容量

FIFO队列
FIFO队列就是利用队列先进先出的原则,最常使用的就是消息队列,就是说保证每个应用程序先到先得,使得资源分配公平公正。

Fair Scheduler公平分配
公平调度FAIR,该算法的思想是尽可能地公平调度,即已分配资源量少的优先级高。也就是说,在考虑如何分配资源时,调度器尽可能使得每个应用程序都能够得到大致相当的资源。默认情况下,公平性只通过内存来衡量,但是可以配置成内存和CPU。
这种策略使得运行时间短的应用能够尽快结束,而不至于在等待资源时被饿死。另外,也可以为应用程序配置优先级,优先级用于决定资源使用量的占比。

要使用Fair Scheduler,在conf/yarn-site.xml中如下配置:

<property>
 <name>yarn.resourcemanager.scheduler.class</name>
 <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>

Capacity Scheduler容量

该调度器用于在共享、多租户(multi-tenant)的集群环境中运行Hadoop应用,对运营尽可能友好的同时最大化吞吐量和效用。
该调度器保证共享集群的各个组织能够得到容量的保证,同时可以超额使用集群中暂时没有人使用的资源。Capacity Scheduler为了实现这些目标,抽象了queue的概念,queue通常由管理员配置。为了进一步细分容量的使用,调度器支持层级化的queue(hierarchical queues),使得在特定组织内部,可以进一步有效利用集群资源。

Capacity调度器支持的一些特性如下:

层级队列(Hierarchical Queues)
容量保证
安全性:每个队列都有队列的访问权限控制(ACL)
弹性: 空闲资源可以额外分配给任何需要的队列
多租户
基于资源的调度(resouce-based scheduling): 对资源敏感的应用程序,可以有效地控制资源情况
支持用户(组)到queue的映射:基于用户组提交作业到对应queue。
运营支持:支持运行时配置队列的容量,ACL等。也可以在运行时停止queue阻止进一步往queue提交作业。

要使用该调度器,在conf/yarn-site.xml配置如下:

<property>
 <name>yarn.resourcemanager.scheduler.class</name>
 <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>

Applications MasterManager

Applications MasterManager是ResourceManager下的应用程序管理器。它负责管理整个系统中所有应用程序,包括应用程序提交、与调度器协商资源以启动ApplicationMaster、监控ApplicationMaster运行状态并在失败时重新启动它等。管理YARN内运行的应用程序的每个实例。

它主要的功能如下:

  1. 数据切分
  2. 为应用程序申请资源并进—步分配给内部任务。(资源二次分配)
  3. 任务监控与容错
  4. 负责协调来自resourcemanager的资源,并通过nodemanager监视容易的执行和资源使用情况。

Nodemanager

Nodemanager是hadoop YARN中负责每个节点上的资源和使用的体系结构。通过和ResourceManager配合,NodeManager负责整个Hadoop集群中的资源分配工作。ResourceManager是一个全局的进程,而NodeManager只是每个节点上的进程,管理这个节点上的资源分配和监控运行节点的健康状态。

它的功能如下:

  1. 单个节点上的资源管理和任务。
  2. 处理来自于resourcemanager的命令。
  3. NodeManager 接收并处理来自ApplicationMaster的Container启动、停止等各种请求。
  4. Nodemanager管理着抽象容器,这些抽象容器代表着一些特定程序使用针对每个节点的资源。
  5. Nodemanager定时地向RM汇报本节点上的资源使用情况和各个Container的运行状态(cpu和内存等资源)。

ApplicationMaster

ApplicationMaster是对运行在Yarn中某个应用的抽象,它其实就是某个类型应用的实例。

当用户提交一个应用程序时,需要提供一个用以跟踪和管理这个程序的ApplicationMaster,它负责向ResourceManager申请资源,并要求NodeManger启动可以占用一定资源(包含cpu,内存等)的任务(container),同时和NodeManger交互来执行和监控具体的task。由于不同的ApplicationMaster被分布到不同的nodemanager节点上,因此它们之间不会相互影响。

它的功能如下:

  1. 管理—个在yarn内运行的应用程序的每个实例(hive,spark)
  2. 数据切分
  3. 为应用程序申请资源,并分配给内部任务
  4. 任务监控与容错
  5. 负责协调来自ResourceManager的资源,通过nodeManager监视容器的执行和资源使用(cpu、内存等资源分配)

container

Container是yarn中动态分配资源的一个单位,包涵内存、CPU等等资源的抽象,yarn以Container为单位分配资源。—个NodeManager上面可以运行多个Container,Container之间的资源互相隔离。

一个Container指的是具体节点上的计算资源,这就意味着Container中必定含有计算资源的位置信息:计算资源位于哪个机架的哪台机器上。所以我们在请求某个Container时,其实是向某台机器发起的请求,请求的是这台机器上的CPU和内存资源。

任何一个job或application必须运行在一个或多个Container中,在Yarn框架中,ResourceManager只负责告诉ApplicationMaster哪些Containers可以用,ApplicationMaster还需要去找NodeManager请求分配具体的Container。

YARN工作流程

当用户向YARN中提交一个应用程序(作业)后,YARN将分三个阶段运行该应用程序:第一阶段是作业JOB或者应用程序的提交。第二阶段是启动ApplicationMaster。第三阶段是由ApplicationMaster创建应用程序,为它申请资源,并监控它的整个运行过程,直到运行完成。关于HDFS的内容,请参考Hadoop系列(一)——身体是革命的本钱 HDFS体系结构(NameNode、DataNode)详解;关于第三阶段会涉及到hadoop 心脏命脉 MapReduce。具体如下:

在这里插入图片描述

  1. Client 向hadoop 提交作业(实际是应用程序,其中包括AM程序、启动AM的命令、命令参数、用户程序等),申请jobID;
  2. ResourceManager返回一个作业ID ,井将路径返回给客户端Client ;这个路径是hadoop中HDFS存储该作业的预分配位置,用于存放作业所需的资源;
  3. Client端将运行作业所需要的资源( Jar包、 配置信息、分片信息等)上传到到返回的HDFS路径;
  4. Client 上传成功后,向ResourceManager发送请求执行作业;
  5. ResourceManager收到请求,将请求转发到调度器Resource Scheduler;
  6. 调度器Resource Scheduler会将任务放到调度队列,当执行到相应的请求时。会通知Applicpyon Manager分配容器,调用NodeManager开辟第一个Container ,并与对应的NM通信,创建作业对应的AplicationMaster;
  7. Application Manager(AM)开辟资源( Container) ,启动ApplicationMaster,并监控其运行状态,直到任务结束;
  8. ApplicationMaster获取HDFS上提交的文件。根据切片信息,创建MapTask和ReduceTask,也就是MapReduce,只是hadoop的核心所在。
  9. ApplicatjonMaster向调度器Resource Scheduler申请运行MapTask和RedaceTask的资源;这个申请的过程实际上是AM采用轮询的方式通过RPC协议向RM申请和领取资源;资源的协调通过 AMRMClientAsync异步完成,相应的处理方法封装在AMRMClientAsync.CallbackHandler中;
  10. 调度器Resource Scheduler返回执行信息和资源给NodeManager;
  11. 调度器Resource Scheduler通知NodeManager ,启动任务;
  12. NodeMandger启动任务;
  13. MapTask和Reduce Task接受共享文件数据,这个在整个任务执行过程中均是这样;
  14. 程序运行完成后,发送请求,释放资源。

此外,YARN是一个资源调度平台,负责为运算程序提供服务器运算资源。它有三种主流运算框架(程序),本例采用的就是第一种mapreduce的过程。运算框架如下:

  1. mapreduce离线批处理:mapreduce的过程(input split— > shuffle---- >output)
  2. storm实时流式处理
  3. spark可以实现离线数据的批处理,也可以对流式数据进行处理

常见问题

1. 如果DataNode坏了怎么办?
ResourceManager(yarn) 通过NodeManager 心跳实时监控DataNode(dn)状况,一旦发现一定时间内未获取心跳包,则yarn将移除该dn,并启动另一个备份节点(replica)代替。

2. 如果ApplicationMaster坏了怎么办?
Yarn 通过心跳实时监控ApplicationMaster实时状态,可以通过配置多少次才算失败,否则一次性失败即认定为失败。如果失败,yarn会另起一个ApplicationMaster。

3. 如果ResourceManager坏了怎么办?
1)通过checkpoint 定期存盘,失败后重新启动;
2)通过zookeepre同步状态实现高可用。

4. Namenode如何决定副本存在哪个Datanode?
第一个副本放在客户端相同的机器上,如果机器在集群之外,随机选择一个(但是会尽可能选择容量不是太慢或者当前操作太繁忙的)
第二个副本随机放在不同于第一个副本的机架上。
第三个副本放在跟第二个副本同一机架上,但是不同的节点上,满足条件的节点中随机选择。
更多的副本在整个集群上随机选择,虽然会尽量便面太多副本在同一机架上。
副本的位置确定之后,在建立写入管道的时候,会考虑网络拓扑结构。下面是可能的一个存放策略:
在这里插入图片描述

这样选择很好的平衡了可靠性、读写性能

  • 可靠性:Block分布在两个机架上
  • 写带宽:写入管道的过程只需要跨越一个交换机
  • 读带宽:可以从两个机架中任选一个读取

5. Hadoop节点距离
在读取和写入的过程中,namenode在分配Datanode的时候,会考虑节点之间的距离。HDFS中,距离没有采用带宽来衡量,因为实际中很难准确度量两台机器之间的带宽。
Hadoop把机器之间的拓扑结构组织成树结构,并且用到达公共父节点所需跳转数之和作为距离。事实上这是一个距离矩阵的例子。下面的例子简明地说明了距离的计算:

在这里插入图片描述
Hadoop集群的拓扑结构需要手动配置,如果没配置,Hadoop默认所有节点位于同一个数据中心的同一机架上。

  • 8
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值