资源调度框架Yarn--Hadoop中最亮的星

Posted 后厂反应堆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了资源调度框架Yarn--Hadoop中最亮的星相关的知识,希望对你有一定的参考价值。

本文作者




目录:

1.Yarn介绍

2.Yarn的架构

3.Yarn上Application的运行原理

4.总结


一、Yarn介绍


读懂本文,需要你具备的基础知识:

  1. MapReduce

  2. HDFS

资源调度框架Yarn--Hadoop中最亮的星


Apache Hadoop Yarn 是 Apache Software Foundation Hadoop的子项目,为分离Hadoop2.0资源管理和计算组件而引入。Yarn的诞生缘于存储于HDFS的数据需要更多的交互模式,不单单是MapReduce模式。Hadoop2.0 的Yarn 架构提供了更多的处理框架,不再强迫使用MapReduce框架。

资源调度框架Yarn--Hadoop中最亮的星


当企业的数据在HDFS中是可用的,有多种数据处理方式是非常重要的。有了Hadoop2.0和Yarn,机构可以采用流处理、互动数据处理方式以及其他的基于Hadoop的应用程序。


二、Yarn的架构


YARN还是经典的主从(master/slave)结构,如下图所示。大体上看,Yarn服务由一个ResourceManager(RM)和多个NodeManager(NM)构成,ResourceManager为主节点(master),NodeManager为从节点(slave)。

资源调度框架Yarn--Hadoop中最亮的星

ApplicationMaster可以在容器内运行任何类型的任务。例如,MapReduce ApplicationMaster请求容器启动map或reduce任务,而ApplicationMaster请求容器运行Giraph任务。


核心组件

资源调度框架Yarn--Hadoop中最亮的星


ResourceManager 负责对各个 NodeManager 上资源进行统一管理和调度。当用户提交一个应用程序时,需要提供一个用以跟踪和管理这个程序的 ApplicationMaster,它负责向 ResourceManager 申请资源,并要求 NodeManger 启动可以占用一定资源的任务。由于不同的 ApplicationMaster 被分布到不同的节点上,因此它们之间不会相互影响。


Client 向 ResourceManager 提交的每一个应用程序都必须有一个 ApplicationMaster,它经过 ResourceManager 分配资源后,运行于某一个 Slave 节点的 Container 中,具体做事情的 Task,同样也运行于某一个 Slave 节点的 Container 中。


2.1 ResourceManager


RM是一个全局的资源管理器,集群只有一个,负责整个系统的资源管理和分配,包括处理客户端请求、启动/监控 ApplicationMaster、监控 NodeManager、资源的分配与调度。它主要由两个组件构成:调度器(Scheduler)和应用程序管理器(Applications Manager,ASM)。


(1)调度器


调度器根据容量、队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统中的资源分配给各个正在运行的应用程序。需要注意的是,该调度器是一个“纯调度器”,它不从事任何与具体应用程序相关的工作,比如不负责监控或者跟踪应用的执行状态等,也不负责重新启动因应用执行失败或者硬件故障而产生的失败任务,这些均交由应用程序相关的ApplicationMaster完成。


调度器仅根据各个应用程序的资源需求进行资源分配,而资源分配单位用一个抽象概念“资源容器”(Resource Container,简称Container)表示,Container是一个动态资源分配单位,它将内存、CPU、磁盘、网络等资源封装在一起,从而限定每个任务使用的资源量。


(2) 应用程序管理器


应用程序管理器主要负责管理整个系统中所有应用程序,接收job的提交请求,为应用分配第一个 Container 来运行 ApplicationMaster,包括应用程序提交、与调度器协商资源以启动 ApplicationMaster、监控 ApplicationMaster 运行状态并在失败时重新启动它等。


2.2 ApplicationMaster


管理应用程序运行过程中的每个task。Yarn 允许我们为自己的应用程序开发 ApplicationMaster。


功能:

  • 为应用程序申请资源并进一步分配给内部任务(TASK);

  • 任务监控与容错;

  • 负责协调来自ResourceManager的资源,并通过NodeManager监视task的执行和资源使用情况。


可以说,ApplicationMaster 与 ResourceManager 之间的通信是整个 Yarn 应用从提交到运行的最核心部分,是 Yarn 对整个集群进行动态资源管理的重要步骤,Yarn 的动态性,就是来源于多个Application 的 ApplicationMaster 动态地和 ResourceManager 进行沟通,不断地申请、释放、再申请、再释放资源的过程。


2.3 NodeManager


整个集群有多个NodeManager ,负责每个节点上的资源和使用。


NodeManager 是一个 slave 服务:它负责接收 ResourceManager 的资源分配请求,分配具体的 Container 给应用。同时,它还负责监控并报告 Container 使用信息给 ResourceManager。


功能:

  • NodeManager 本节点上的资源使用情况和各个 Container 的运行状态。

  • 接收及处理来自 ResourceManager 的命令请求,分配 Container 给应用的某个任务;

  • 定时地向RM汇报以确保整个集群平稳运行,RM 通过收集每个 NodeManager 的报告信息来追踪整个集群健康状态的,而 NodeManager 负责监控自身的健康状态;

  • 处理来自 ApplicationMaster 的请求;

  • 管理着所在节点每个 Container 的生命周期;

  • 管理每个节点上的日志;

  • 执行 Yarn 上面应用的一些额外的服务,比如 MapReduce 的 shuffle 过程;


当一个节点启动时,它会向 ResourceManager 进行注册并告知 ResourceManager 自己有多少资源可用。在运行期,通过 NodeManager 和 ResourceManager 协同工作,这些信息会不断被更新并保障整个集群发挥出最佳状态。


NodeManager 只负责管理自身的 Container,它并不知道运行在它上面应用的信息。负责管理应用信息的组件是 ApplicationMaster。


2.4 Container


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


Container 和集群节点的关系是:一个节点会运行多个 Container,但一个 Container 不会跨节点。任何一个 job 或 application 必须运行在一个或多个 Container 中,在 Yarn 框架中,ResourceManager 只负责告诉 ApplicationMaster 哪些 Containers 可以用,ApplicationMaster 还需要去找 NodeManager 请求分配具体的 Container。


需要注意的是,Container 是一个动态资源划分单位,是根据应用程序的需求动态生成的。目前为止,Yarn 仅支持 CPU 和内存两种资源,且使用了轻量级资源隔离机制 Cgroups 进行资源隔离。


功能:

  • 对task环境的抽象;

  • 描述一系列信息;

  • 任务运行资源的集合(CPU、内存、IO等);

  • 任务运行环境


2.5 Resource Request 及 Container


Yarn的设计目标就是允许我们的各种应用以共享、安全、多租户的形式使用整个集群。并且,为了保证集群资源调度和数据访问的高效性,Yarn还必须能够感知整个集群拓扑结构。


为了实现这些目标,ResourceManager的调度器Scheduler为应用程序的资源请求定义了一些灵活的协议,通过它就可以对运行在集群中的各个应用做更好的调度,因此,这就诞生了Resource Request和Container。


ApplicationMaster将资源请求以resource-request的形式发送给ResourceManager的Scheduler,Scheduler再在这个原始的resource-request中返回分配到的资源描述Container。


每个ResourceRequest可看做一个可序列化Java对象,包含的字段信息如下:

<!--- resource-name:资源名称,现阶段指的是资源所在的host和rack,后期可能还会支持虚拟机或者更复杂的网络结构- priority:资源的优先级- resource-requirement:资源的具体需求,现阶段指内存和cpu需求的数量- number-of-containers:满足需求的Container的集合--><resource-name, priority, resource-requirement, number-of-containers>


三、Yarn上Application的运行原理


Yarn是如何工作的?Yarn的基本理念包括以下几部分: 

  1. 一个全局的资源管理ResourceManager

  2. 每个应用程序拥有一个ApplicationMaster

  3. 每个从节点一个NodeManager

  4. 每个应用程序运行在一个,或多个NodeManager上的Container 上面


ResouceManager 和 NodeManager 组成了一个新的、通用的、用分布式管理应用程序的系统。ResourceManager 对系统中的应用程序资源有终极仲裁的权限。ApplicationMaster 每个应用程序都有一个,它的责任是同ResourceManager 谈判资源 ,同时执行和监控运行于NodeManager的组件任务。NodeManager 负责发布应用程序容器,监控资源的使用并向ResourceManager进行汇报。每个ApplicationMaster都有职责从调度器那谈判得到适当的资源容器,追踪它们的状态,并监控他们的进程。从系统的视图看,ApplicationMaster 作为一个普通的容器运行着。


一个通用的application执行过程:

资源调度框架Yarn--Hadoop中最亮的星


3.1 Yarn应用提交过程


Application在Yarn中的执行过程,整个执行过程可以总结为三步:

  1. 应用程序提交

  2. 启动应用的ApplicationMaster实例

  3. ApplicationMaster 实例管理应用程序的执行


具体提交过程为:

  1. 客户端程序向 ResourceManager 提交应用并请求一个 ApplicationMaster 实例;

  2. ResourceManager 找到一个可以运行一个 Container 的 NodeManager,并在这个 Container 中启动 ApplicationMaster 实例;

  3. ApplicationMaster 向 ResourceManager 发送 resource-request请求;

  4. 当 Container 被成功分配后,ApplicationMaster 通过向 NodeManager 发送 container-launch-specification信息 来启动Container;

  5. 应用程序的代码以 task 形式在启动的 Container 中运行,并把运行的进度、状态等信息通过 application-specific协议 发送给ApplicationMaster;

  6. 应用程序的代码以 task 形式在启动的 Container 中运行,并把运行的进度、状态等信息通过 application-specific协议 发送给ApplicationMaster;

  7. 在应用程序运行期间,提交应用的客户端主动和 ApplicationMaster 交流获得应用的运行状态、进度更新等信息,交流协议也是 application-specific协议;

  8. 一旦应用程序执行完成并且所有相关工作也已经完成,ApplicationMaster 向 ResourceManager 取消注册然后关闭,用到所有的 Container 也归还给系统。


精简版的:


步骤1:用户将应用程序提交到 ResourceManager 上;


步骤2:ResourceManager 为应用程序 ApplicationMaster 申请资源,并与某个 NodeManager 通信启动第一个 Container,以启动ApplicationMaster;


步骤3:ApplicationMaster 与 ResourceManager 进行通信,为内部要执行的任务申请资源,一旦得到资源后,将与 NodeManager 通信,以启动对应的 Task;


步骤4:所有任务运行完成后,ApplicationMaster 向 ResourceManager 注销,整个应用程序运行结束。


3.2 Mapreduce on Yarn


MapReduce基于Yarn的工作原理:


我们通过提交jar包,进行MapReduce处理,整个运行过程分为五个环节:


(1)向Client端提交MapReduce job.

(2)随后Yarn的ResourceManager进行资源的分配。

(3)NodeManager加载并监控Container。

(4)通过ApplicationMaster与ResourceManager进行资源的申请及状态的交互,由NodeManagers进行MapReduce运行时job的管理。

(5)通过HDFS进行job配置文件、jar包的各节点分发。


资源调度框架Yarn--Hadoop中最亮的星


Job 初始化过程:

  1. 当ResourceManager收到了submitApplication()方法的调用通知后,scheduler开始分配container,随之ResouceManager发送applicationMaster进程的信息,告知每个nodeManager管理器。

  2. 由applicationMaster决定如何运行tasks。

  3. 在运行tasks之前,applicationMaster将会调用setupJob()方法。


Task 任务分配:

  1. 接下来applicationMaster向ResourceManager请求containers用于执行map与reduce的tasks(step 8),这里map task的优先级要高于reduce task。

  2. 运行tasks的是需要消耗内存与CPU资源的,默认情况下,map和reduce的task资源分配为1024MB与一个核。


Task 任务执行:

  1. 这时一个task已经被ResourceManager分配到一个container中,由applicationMaster告知nodemanager启动container,这个task将会被一个主函数为YarnChild的java application运行,但在运行task之前,首先定位task需要的jar包、配置文件等。

  2. YarnChild运行于一个专属的JVM中,所以任何一个map或reduce任务出现问题,都不会影响整个nodemanager的crash或者hang。

  3. 每个task都可以在相同的JVM task中完成,随之将完成的处理数据写入临时文件中。


运行进度与状态更新:

  1. MapReduce是一个较长运行时间的批处理过程,可以是一小时、几小时甚至几天,那么Job的运行状态监控就非常重要。每个job以及每个task都有一个包含job(running,successfully completed,failed)的状态,以及value的计数器,状态信息及描述信息(描述信息一般都是在代码中加的打印信息)。

  2. 当一个task开始执行,它将会保持运行记录,记录task完成的比例,对于map的任务,将会记录其运行的百分比,对于reduce来说可能复杂点,但系统依旧会估计reduce的完成比例。当一个map或reduce任务执行时,子进程会持续每三秒钟与applicationMaster进行交互。


3.3 Yarn应用生命周期


  • RM: Resource Manager

  • AM: Application Master

  • NM: Node Manager


(1)Client向RM提交应用,包括AM程序及启动AM的命令。

(2)RM为AM分配第一个容器,并与对应的NM通信,令其在容器上启动应用的AM。

(3)AM启动时向RM注册,允许Client向RM获取AM信息然后直接和AM通信。

(4)AM通过资源请求协议,为应用协商容器资源。

(5)如容器分配成功,AM要求NM在容器中启动应用,应用启动后可以和AM独立通信。

(6)应用程序在容器中执行,并向AM汇报。

(7)在应用执行期间,Client和AM通信获取应用状态。

(8)应用执行完成,AM向RM注销并关闭,释放资源。


申请资源->启动appMaster->申请运行任务的container->分发Task->运行Task->Task结束->回收container


四、总结


至此,Yarn介绍完了,我们最后串一遍。

在本文中,从Yarn的架构演进讲起,由此大家清楚了Yarn的产生是为了解决什么问题。

接着,依次介绍了Yarn中的核心组件,包括其定义、角色、分工。

最后一部分,是Yarn上Applicaton的运行原理。


首先,通过前面的讲解,大家清楚Yarn作为平台一个公用的资源分配组件,其上可以运行各种应用程序框架,比如MR,Spark,Flink等等。我们用一个通用的流程图,讲了各个应用框架之下,其Application在Yarn上的运行原理。

随后,我们以MR应用为例,将流程细化,分步讲解,并和上面的通用流程对比,加深印象。


有了Yarn,Hadoop生态不再局限于MapReduce计算框架,变得更加友好,开放。Yarn也因此,成为了Hadoop中最亮的一颗星。


谢谢大家。


查看图片,


开启学习之旅





现面向所有技术发烧友

征集优秀原创技术文章

后厂反应堆将为你提供展示平台

期待你的分享哦!

(可添加上图微信投稿)



以上是关于资源调度框架Yarn--Hadoop中最亮的星的主要内容,如果未能解决你的问题,请参考以下文章

夜空中最亮的星

夜空中最亮的星

TWITTER新品来袭:夜空中最亮的星---T10

夜空中最亮的星:慕课网新手学习指南_慕课手记

云计算/数据库IDC-5G流量时代最亮的星

2020年4月编程语言排行榜:C语言直逼Java,但Scratch才是本月最亮的星