我们都知道Yarn是MRV2中才有的Hadoop组成部分,是MRv1存在各种局限性导致,其局限性大致概括为以下方面:
正是由于 MRv2 将资源管理功能抽象成了一个 独立的通用系统 YARN,直接导致下一代 MapReduce 的核心从单一的计算框架 MapReduce转移为通用的资源管理系统 YARN。
随着互联网的高速发展,基于数据密集型应用的计算框架不断出现,从支持离线处理 的 MapReduce,到支持在线处理的 Storm,从迭代式计算框架 Spark 到流式处理框架 S4,等等。各种框架有其应用的场景。而在实际互联网公司中,这几种框架不是选其一,而是根据场景有不同的选择共同构建整个计算框架。考虑成本、运维、数据共享等等因素,实际更希望的是将这些框架都部署到一个公共的集群中,共享集群资源,并对资源进行统一管理,同时采用某种资源隔离方案(如轻量级 cgroups)对各个任务进行隔离,这样便诞生了轻量级弹性计算平台。YARN 便是弹性计算平台的典型代表。
YARN 实际上是一个弹性计算平台,它的目标已经不再局限于支持 MapReduce 一种计算框架,而是朝着对多种框架进行统一管理的方向发展。
相比于“一种计算框架一个集群”的模式,共享集群的模式存在多种好处:
在 Hadoop 1.0 中,JobTracker 由资源管理(由 TaskScheduler 模块实现)和作业控制(由 JobTracker 中多个模块共同实现)两部分组成。当前 Hadoop MapReduce 之所以在可扩展性、资源利用率和多框架支持等方面存在不足,正是由于 Hadoop 对 JobTracker 赋予的功能过多而造成负载过重(正如一些公司既想要打工人能够做开发还要能做产品最好还能写前端并做UI的话,美名曰,“全栈”)。此外,从设计角度上看,Hadoop 未能够将资 源管理相关的功能与应用程序相关的功能分开,造成 Hadoop 难以支持多种计算框架。
而Hadoop2.x框架的基本设计思想是将 JobTracker 的两个主要功能,即资源管理和作业控制(包括作业监控、容错等),分拆成两独立的进程。资源管理进 程与具体应用程序无关,它负责整个集群的资源(内存、CPU、磁盘等)管理,而作业控 制进程则是直接与应用程序相关的模块,且每个作业控制进程只负责管理一个作业。这样, 通过将原有 JobTracker 中与应用程序相关和无关的模块分开,不仅减轻了 JobTracker 负载, 也使得 Hadoop 支持更多的计算框架。
从资源管理角度看,MRv2 框架实际上衍生出了一个资源统一管理平台 YARN,它使得 Hadoop 不再局限于仅支持 MapReduce 一种计算模型,而是可无限融入多 种计算框架,且对这些框架进行统一管理和调度。
YARN 总体上仍然是 Master/Slave 结构,在整个资源管理框架中,ResourceManager 为 Master,NodeManager 为 Slave,ResourceManager 负责对各个 NodeManager 上的资源进行 统一管理和调度。当用户提交一个应用程序时,需要提供一个用以跟踪和管理这个程序的 ApplicationMaster,它负责向 ResourceManager 申请资源,并要求 NodeManger 启动可以占 用一定资源的任务。由于不同的 ApplicationMaster 被分布到不同的节点上,因此它们之间 不会相互影响。
YARN 主要由 ResourceManager、NodeManager、 ApplicationMaster(图中给出了 MapReduce 和 MPI 两种计算框架的 ApplicationMaster,分 别为 MR AppMstr 和 MPI AppMstr)和 Container 等几个组件构成。
1. ResourceManager(RM)
RM 是一个全局的资源管理器,负责整个系统的资源管理和分配。它主要由两个组件 构成:调度器(Scheduler)和应用程序管理器(Applications Manager,AM)。
该调度器是 一个“纯调度器”,它不再从事任何与具体应用程序相关的工作,比如不负责监控或者跟踪 应用的执行状态等,也不负责重新启动因应用执行失败或者硬件故障而产生的失败任务, 这些均交由应用程序相关的 ApplicationMaster 完成。调度器仅根据各个应用程序的资源需求进行资源分配,而资源分配单位用一个抽象概念“资源容器”(Resource Container,简称 Container)表示,Container 是一个动态资源分配单位,它将内存、CPU、磁盘、网络等资源封装在一起,从而限定每个任务使用的资源量。
此外,该调度器是一个可插拔的组件, 用户可根据自己的需要设计新的调度器,YARN 提供了多种直接可用的调度器,比如 Fair Scheduler 和 Capacity Scheduler 等。
应用程序管理器负责管理整个系统中所有应用程序,包括应用程序提交、与调度器协商资源以启动 ApplicationMaster、监控 ApplicationMaster 运行状态并在失败时重新启动它等。
2.ApplicationMaster(AM)
用户提交的每个应用程序均包含一个 AM,主要功能包括:
❑ 与 RM 调度器协商以获取资源(用 Container 表示);
❑ 将得到的任务进一步分配给内部的任务;
❑ 与 NM 通信以启动 / 停止任务;
❑ 监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务。
NM 是每个节点上的资源和任务管理器,一方面,它会定时地向 RM 汇报本节点上的资源使用情况和各个 Container 的运行状态;另一方面,它接收并处理来自 AM 的 Container 启动 / 停止等各种请求。
Container 是 YARN 中的资源抽象,它封装了某个节点上的多维度资源,如内存、 CPU、磁盘、网络等,当 AM 向 RM 申请资源时,RM 为 AM 返回的资源便是用 Container 表示的。YARN 会为每个任务分配一个 Container,且该任务只能使用该 Container 中描述的 资源。Container是一个动态资源划分单位,是 根据应用程序的需求动态生成的。
目前YARN 仅支持 CPU 和内存两种资源, 且使用了轻量级资源隔离机制 Cgroups 进行资源隔离。
RPC 协议是连接各个组件的“大动脉”,了解不同组件之间的 RPC 协议有助于我们更深入地学习 YARN 框架。在 YARN 中,任何两个需相互通信的组件之间仅有一个 RPC 协 议,而对于任何一个 RPC 协议,通信双方有一端是 Client,另一端为 Server,且 Client 总 是主动连接 Server 的,因此,YARN 实际上采用的是拉式(pull-based)通信模型。YARN 主要由以 下几个 RPC 协议组成:
运行在 YARN 上的应用程序主要分为两类 :短应用程序和长应用程序,其中,
短应 用程序是指一定时间内(可能是秒级、分钟级或小时级,尽管天级别或者更长时间的也存 在,但非常少)可运行完成并正常退出的应用程序。比如:MapReduce作业。
长应用程序是指不出意外,永不终止运行的 应用程序,通常是一些服务,比如 Storm Service(主要包括 Nimbus 和 Supervisor 两类服 务),HBase Service(包括 Hmaster 和 RegionServer 两类服务) 等。
尽管这两类应用程序作用不同,一类直接运行数据处理程序,一类用于部署服务(服务之上再运行数据处理程序),但运行在 YARN 上的流程是相同的。
当用户向 YARN 中提交一个应用程序后,YARN 将分两个阶段运行该应用程序 :第一 个阶段是启动 ApplicationMaster ;第二个阶段是由 ApplicationMaster 创建应用程序,为它 申请资源,并监控它的整个运行过程,直到运行完成。
可将 YARN 看做一个云操作系统,它负责为应用程序启 动 ApplicationMaster(相当于主线程),然后再由 ApplicationMaster 负责数据切分、任务分配、 启动和监控等工作,而由 ApplicationMaster 启动的各个 Task(相当于子线程)仅负责自己的计 算任务。当所有任务计算完成后,ApplicationMaster 认为应用程序运行完成,然后退出。
将 YARN 看做一个云操作系统,它负责为应用程序启 动 ApplicationMaster(相当于主线程),然后再由 ApplicationMaster 负责数据切分、任务分配、 启动和监控等工作,而由 ApplicationMaster 启动的各个 Task(相当于子线程)仅负责自己的计 算任务。当所有任务计算完成后,ApplicationMaster 认为应用程序运行完成,然后退出。
资源管理系统的主要功能是对集群中各类资源进行抽象,并根据各种应用程序或者服 务的要求,按照一定的调度策略,将资源分配给它们使用,同时需采用一定的资源隔离机制防止应用程序或者服务之间因资源抢占而相互干扰。YARN 正是一个资源管理系统,它的出现弱化了计算框架之争,引入 YARN 这一层后,各种计算框架可各自发挥自己的优势, 并由 YARN 进行统一管理,进而运行在一个大集群上。
云计算包括以下几个层次的服务 :IaaS、PaaS 和 SaaS。
IaaS(Infrastructure-as-a-Service) :基础设施即服务。消费者通过 Internet 可以从完善的计算机基础设施获得服务。Iaas 通过网络向用户提供计算机(物理机和虚拟机)、存储空间、 网络连接、负载均衡和防火墙等基本计算资源 ;用户在此基础上部署和运行各种软件,包括操作系统和应用程序等。如阿里云、华为云等云平台。
PaaS(Platform-as-a-Service) :平台即服务。PaaS 是将软件研发的平台作为一种服务, 以 SaaS 的模式提交给用户。平台通常包括操作系统、编程语言的运行环境、数据库和 Web 服务器等,用户可以在平台上部署和运行自己的应用。通常而言,用户不能管理和控制底 层的基础设施,只能控制自己部署的应用。
SaaS(Software-as-a-Service):软件即服务。它是一种通过 Internet 提供软件的模式,用 户无需购买软件,而是向提供商租用基于 Web 的软件,来管理企业经营活动。云提供商在 云端安装和运行应用软件,云用户通过云客户端(比如 Web 浏览器)使用软件。
从云计算分层概念上讲,YARN 可看做 PAAS 层,它能够为不同类型的应用程序提供 统一的管理和调度。
YARN 的设计理念和基本架构,包括 YARN 产生背 景、Hadoop 术语解释和版本变迁、YARN 架构和通信协议等。
从编程模型角度看,YARN 与传统并行编程模式非常像,但兼具了分布式和并行两个特点 ;从资源管理系统角度看, YARN 将扮演为上层计算框架提供计算资源的角色 ;从云计算角度看,YARN 可看做轻量 级的 PAAS 层。