Hadoop ON YARN详解

1,035 阅读6分钟

介绍

Apache Hadoop YARN (Yet Another Resource Negotiator,另一种资源协调者)是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。

Yarn与传统的Hadoop MapReduce计算框架

浅入深出了解Hadoop MapReduce

YARN的基本思想是将JobTracker的两个主要功能(资源管理和作业调度/监控)分离,主要方法是创建一个全局的ResourceManager(RM)和若干个针对应用程序的ApplicationMaster(AM)。这里的应用程序是指传统的MapReduce作业或作业的DAG。

YARN 分层结构的本质是 ResourceManager。这个实体控制整个集群并管理应用程序向基础计算资源的分配。

ResourceManager将各个资源部分(计算、内存、带宽等)精心安排给基础 NodeManager。ResourceManager 还与 ApplicationMaster 一起分配资源,与 NodeManager一起启动和监视它们的基础应用程序。

在此上下文中,ApplicationMaster 承担了以前的 TaskTracker 的一些角色,ResourceManager 承担了 JobTracker 的角色。

ApplicationMaster 管理着在 YARN 内运行的应用程序的每个实例。ApplicationMaster 负责协调来自 ResourceManager 的资源,并通过 NodeManager 监视容器的执行和资源使用(CPU、内存等的资源分配)。

主要优点

大大减小了 Yarn的ResourceManager资源消耗,并且让监测每一个 Job 子任务 (tasks) 状态的程序分布式化了,更安全、更优美。

在新的 Yarn 中,ApplicationMaster 是一个可变更的部分,用户可以对不同的编程模型写自己的 AppMaster,让更多类型的编程模型能够跑在 Hadoop 集群中。

老的框架中,JobTracker 一个很大的负担就是监控 job 下的 tasks 的运行状况,现在,这个部分就扔给 ApplicationMaster 做了,而 ResourceManager 中有一个模块叫做 ApplicationsMasters( 此处注意是带S的),它是监测 ApplicationMaster 的运行状况,如果出问题,会将其在其他机器上重启。

Container 是 Yarn 为了将来作资源隔离而提出的一个框架。目前是一个框架,仅仅提供 java 虚拟机内存的隔离,hadoop 团队的设计思路应该后续能支持更多的资源调度和控制。

核心思想

它由下面几大构成组件:

  • a. 一个全局的资源管理器 ResourceManager
  • b.ResourceManager的 每个节点代理 NodeManager
  • c. 表示每个应用的 ApplicationMaster
  • d. 每一个ApplicationMaster拥有多个Container在NodeManager上运行

模块工作职能(主要架构)

ApplicationMaster(AM)

用户提交的应用程序均包含一个AM,负责应用的监控,跟踪应用执行状态,重启失败任务等。ApplicationMaster是应用框架,它负责向ResourceManager协调资源,并且与NodeManager协同工作完成Task的执行和监控。MapReduce就是原生支持的一种框架,可以在YARN上运行Mapreduce作业。有很多分布式应用都开发了对应的应用程序框架,用于在YARN上运行任务,例如Spark,Storm等。如果需要,我们也可以自己写一个符合规范的YARN

RM只负责监控AM,在AM运行失败时候启动它,RM并不负责AM内部任务的容错,这由AM自己来完成。

ResourceManager(RM)

RM是一个全局的资源管理器,负责对各NM上的资源进行统一管理和调度。为AM分配 空闲的Container运行并监控其运行状态,对AM申请的资源请求分配相应空闲的Container。它主要由两个组件构成:调度器(Scheduler)和应用程序管理器(Applications Manager,ASM)。

调度器(Scheduler)

调度器根据容量、队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统中的资源分配给各个正在运行的应用程序。调度器仅根据各个应用程序的资源需求进行资源分配,而资源分配单位是Container,从而限定每个任务使用的资源量。Shceduler不负责监控或者跟踪应用程序的状态,也不负责任务因为各种原因而需要的重启(由ApplicationsMaster负责)。总之,调度器根据应用程序的资源要求,以及集群机器的资源情况,为应用程序分配封装在Container中的资源。

应用程序管理器(Applications Manager)

应用程序管理器负责管理整个系统中所有应用程序,包括应用程序提交、与调度器协商资源以启动AM、监控AM运行状态并在失败时重新启动等,跟踪 分给Container的进度、状态也是其职责。

NodeManager (NM)

NM是每个节点上的资源和任务管理器。它会定时地向RM汇报本节点上的资源使用情况和各个Container的运行状态;同时会接收并处理来自AM的Container 启动/停止等请求。

Container

是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当AM向RM申请资源时,RM为AM返回的资源便是用Container表示的。 YARN会为每个任务分配一个Container且该任务只能使用该Container中描述的资源。

Container不同于MRv1中的slot,它是一个动态资源划分单位,是根据应用程序的需求动态生成的。不会出现集群资源闲置的尴尬情况.

Yarn工作流程

1、用户向YARN中提交应用程序,其中包括ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等。

2、ResourceManager通过NM为该应用程序分配第一个Container,并与对应的NodeManager通信,要求它在该NM节点的Container中启动应用程序对应的ApplicationMaster。

3、ApplicationMaster首先向ResourceManager注册后,用户可以直接通过ResourceManage查看应用程序的运行状态。然后它将为各任务申请资源,并监控它的运行状态,直到运行结束。

4、ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager(中的Scheduler调度器)申请和领取资源。

5、当ApplicationMaster申请到资源后,便与对应的NodeManager通信,要求它们启动任务。

6、NodeManager为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。

7、各个任务通过RPC协议向ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过RPC向ApplicationMaster查询应用程序的当前运行状态。

8、应用程序运行完成后,ApplicationMaster向ResourceManager注销并关闭自己。