Yarn资源管理器

Yarn简介

Apache Yarn(Yet another Resource Negotiator)是Hadoop集群的资源管理器,负责为上层应用提供资源管理和调度。Yarn在Hadoop集群中充当资源管理和任务调度的框架。
Yarn被引入Hadoop2.0,最初是为了改善MapReduce的实现,但是因为具有足够的通用性,同样也可以支持其他的分布式计算模式,比如Spark,Tez等计算框架。

Yarn的设计思想

Yarn的基本思想是将资源管理和作业调度/监视功能划分为单独的守护进程。它的思想是拥有一个全局的ResourceManager(RM),以及每个应用程序拥有一个Application(AM)。应用程序可以是单个作业,也可以是一组的作业。
一个ResourceManager和多个NodeManager构成了Yarn资源管理框架。它们是yarn启动后长期运行守护进程,来提供核心服务的。
ResourceManager,管理整个集群上所有资源的分配,内部有一个Scheduler(资源调度器)。
NodeManager,是每台机器的资源管理器,也是单个节点的管理者,负责监视容器(container)资源使用情况,并向 ResourceManager及其Scheduler报告使用情况。
container:集群上的可使用资源,包括cpu,内存,磁盘,网络等
ApplicationMaster(简称AM)实际上是框架特定的库,每启动一个应用程序,都会启动一个AM,它的任务是与ResourceManager协商资源,并与NodeManager一起执行和监视任务。

Yarn的架构

1,ResourceManager:ResourceManager负责集群中所有资源的统一管理和作业调度

  • 与客户端交互,处理来自客户端的请求

  • 启动和管理ApplicationMaster,并在它运行失败时重新启动它

  • 管理NodeManager,接收来自NodeManager的资源汇报信息,并向NodeManager下达管理指令(杀死container等)

  • 资源管理和调度,接收来自ApplicationMaster的资源申请,并为之分配资源
    2,NodeManager: NodeManager是Yarn每个具体节点的资源和任务管理者

  • 定时向ResourceManager汇报本节点上资源使用情况和各个Container的运行状况

  • 接收并处理ApplicationMaster对container的启动、停止等各种请求

  • 管理Container的生命周期,监控Contariner的资源使用

  • 管理任务日志和不同应用程序用到的附属服务(auxiliary service)
    3,ApplicationMaster:用户提交的每个应用程序均包含一个ApplicationMaster

  • 与ResourceManager调度器协商以及获取资源

  • 将得到的资源进一步分配给内部的任务

  • 与NodeManager通信以启动和停止服务

  • 监控所有任务的运行状态,并在任务运行失败时,负责进行容错处理
    4,Container
    Container是Yarn的资源抽象,它封装了某个节点上的多个维度的资源,如CPU、内存、磁盘、网络等。当ApplicationMaster申请资源时,ResourceManager为ApplicationMaster返回的资源是用Container表示的。

提交Application到Yarn的流程

1,作业提交
第一步:
client读取作业配置信息并创建Job的环境,调用job.waitForCompletion方法,向集群提交一个MapReduce作业。
第二步:
资源管理器给任务分配一个新的作业ID
第三步:
计算输入文件的分片,将作业的资源(包括Jar包、配置文件、split信息)拷贝到HDFS集群上的作业提交目录
第四步:
通过调用资源管理器的submitApplication()来提交作业

2,作业初始化
第五步:
当资源管理器收到submitApplication()的请求时,就将该请求发送给调度器(scheduler),调度器向NodeManager发送一个启动container的请求
第六步:
节点管理器NodeManager启动Container,内部运行着一个主类为MRAppMaster的Java应用。其通过创造一些对象来监控作业的进度,得到各个task的进度和完成报告。
第七步:
通过分布式文件系统HDFS来获取由客户端提前算好的输入split,然后为每个输入split创建一个Map任务,根据mapreduce.job.reduces创建reduce任务对象

3,任务分配
如果作业很小,为了降低延迟,可以采用Uber模式。在该模式下,所有的Map Task和Reduce Task都在ApplicationMaster所在的Container中运行。

第八步:
如果不是小作业,那么应用管理器向资源管理器请求container来运行所有的map和reduce任务

这些请求是通过心跳来传输的,包括每个map任务的数据位置,比如:存放输入split的主机名和机架(rack),调度器利用这些信息来调度任务,尽量将任务分配给数据的节点和相同机架的节点。

4,任务运行
第九步:
当一个任务是由资源管理器的调度器分配给一个container后,AppMaster通过联系NodeManager来启动container
第十步:
任务由一个主类为YarnChild的Java应用程序执行后,在运行任务之前先本地化需要的资源。
第十一步:
启动并运行map和reduce任务

5,进度和状态更新

Yarn中任务将其进度和状态返回给ApplicationMaster。
客户端每秒向ApplicationMaster请求进度更新,展示给用户。

6,作业完成
除了向Application请求作业进度外,客户端会通过waitForCompletion()检查作业是否完成。
作业完成之后,应用管理器和Container会清理工作状态、作业的执行详情记录文件会被转移到历史服务器目录、container的执行日志会被nodemanager会被上传到hdfs集群供用户长期查询,

Yarn的三种调度器(Scheduler)

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

  1. FIFO Scheduler(FIFO调度器):FIFO调度器将应用放在一个队列中,按照先后顺序运行应用。这种策略较为简单,但是不适合共享集群。因为大的应用会占用集群的所有资源,每个应用必须等待直到轮到自己。
  2. Capacity Scheduler(容量调度器):允许多个组织共享一个Hadoop集群,使用容量调度器时,一个独立的专门队列保证小作业一提交就可以运行。这个策略是以整个集群利用率为代价的,大作业的执行事件会长一些
  3. Fair Scheduler(公平调度器):公平调度器的目的是为所有运行的应用公平的分配资源。使用公平调度器时,不需要预留一定量的资源,因为公平调度器会在所有运行的作业之间动态平衡资源。每个作业启动后,都会分到相同的集群中的资源。

你可能感兴趣的:(Yarn)