大数据系列之Hadoop知识整理(八)Yarn简介,运行过程

hadoop四大模块
-------------------
common
hdfs //namenode + datanode + secondarynamenode
mapred

yarn //resourcemanager + nodemanager

在前两篇我们已经介绍了MapReduce计算模型,以及其核心Shuffle,在还没有Yarn出现之前,MapReduce的作业调度流程如下图所示:

                                           

负责控制以及调度MapReduce作业Job的是JobTracker,负责运行MapReduce作业Job的是TaskTracker。当然,MapReduce在运行时是分成MapTask(Map端)和Reduce Task(Reducer端)来处理的。工作流程简单描述是这样的:JobTracker调度任务给TaskTracker,TaskTracker执行任务时,会返回进度报告。JobTracker则会记录进度的进行状况,如果某个TaskTracker上的任务执行失败,那么JobTracker就会把这个任务分配到另一台TaskTracker,直到任务执行完成。

从上图我们可以看出:

1.JobTracker的主要功能

(1)作业控制:在Hadoop中,每个作业被分割成多个任务(数据切片)JobTracker负责进行作业的调控以及通过心跳机制来对TaskTracker状态的监控(是否 完成任务,是否出现问题等等)

(2)资源管理

2.TaskTracker的主要功能

(1)向JobTracker周期性的汇报所有节点的信息,主要包括两部分:

*机器级别信息:节点健康情况、资源使用情况等。

*任务级别信息:任务执行进度、任务运行状态等。

(2)执行命令

JobTracker会给TaskTracker下达各种命令,主要包括:启动任务(LaunchTaskAction)、

提交任务(CommitTaskAction)、杀死任务(KillTaskAction)、杀死作业(KillJobAction)和重新初始化(TaskTrackerReinitAction)。


尽管Hdaoop MapReduce在全球范围内广受欢迎,但是大部分人还是从Hadoop MapReduce的框架组成中意识到了Hadoop MapReduce框架的局限性:

(1)JobTracker单点瓶颈。在之前的介绍中可以看出,MapReduce中的JobTracker负责作业的分发,管理和调度,同时还必须和集群中的所有节点保持通信,了解机器的运行状态和资源情况。很明显,MapReduce中独一无二的JobTracker负责了太多的任务,如果集群的数量和提交的Job的数量不断增加,那么JobTracker的任务量也会随之快速的上涨,造成JobTracker内存和网络带宽的快速消耗。这样的最终结果就是JobTracker成为集群的单点瓶颈,成为集群作业的中心点和风险的核心。

(2)TaskTracker端,由于作业分配信息过于简单,有可能将多个资源消耗多或运行时间长的任务分配到同一个节点上,这样就会造成作业的单点失败或等待时间过长。

(3)作业延迟过高。在MapReduce运行作业之前,需要TaskTracker汇报自己的资源情况和运行情况,JobTracker根据获取的信息分配作业,TaskTracker获取任务之后再开始运行。这样的结果是通信的延迟造成作业启动时间过长。最显著的影响是小作业并不能及时完成。

(4)编程框架不够灵活。虽然现在的MapReduce框架允许用户自己定义各个阶段的处理函数和对象,但是MapReduce框架还是限制了编程的模式及资源的分配。

针对这些问题,MapReude的设计者提出了下一代的Hadoop MapReduce框架(官方成为MRv2/Yarn)。

1.Yarn简介

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

YARN的基本思想是将JobTracker的两个主要功能(资源管理和作业调度/监控)分离,主要方法是创建一个全局的ResourceManager(RM)和若干个针对应用程序的ApplicationMaster(AM)。这里的应用程序是指传统的MapReduce作业或作业的 DAG(有向无环图)。
YARN 分层结构的本质是 ResourceManager。这个实体控制整个集群并管理应用程序向基础计算资源的分配。ResourceManager 将各个资源部分(计算、 内存带宽等)精心安排给基础 NodeManager(YARN 的每节点代理)。ResourceManager 还与 ApplicationMaster 一起分配资源,与 NodeManager 一起启动和监视它们的基础应用程序。在此上下文中,ApplicationMaster 承担了以前的 TaskTracker 的一些角色,ResourceManager 承担了 JobTracker 的角色。
ApplicationMaster 管理一个在 YARN 内运行的应用程序的每个实例。ApplicationMaster 负责协调来自 ResourceManager 的资源,并通过 NodeManager 监视容器的执行和资源使用( CPU、内存等的资源分配)。请注意,尽管目前的资源更加传统(CPU 核心、内存),但未来会带来基于手头任务的新资源类型(比如图形处理单元或专用处理设备)。从 YARN 角度讲,ApplicationMaster 是用户代码,因此存在潜在的安全问题。YARN 假设 ApplicationMaster 存在错误或者甚至是恶意的,因此将它们当作无特权的代码对待。
NodeManager 管理一个 YARN 集群中的每个节点。NodeManager 提供针对集群中每个节点的服务,从监督对一个容器的终生管理到监视资源和跟踪节点健康。MRv1 通过插槽管理 Map 和 Reduce 任务的执行,而 NodeManager 管理抽象容器,这些容器代表着可供一个特定应用程序使用的针对每个节点的资源。YARN 继续使用 HDFS 层。它的主要 NameNode 用于元数据服务,而 DataNode 用于分散在一个集群中的复制存储服务。
要使用一个 YARN 集群,首先需要来自包含一个应用程序的客户的请求。ResourceManager 协商一个容器的必要资源,启动一个 ApplicationMaster 来表示已提交的应用程序。通过使用一个资源请求协议,ApplicationMaster 协商每个节点上供应用程序使用的资源容器。执行应用程序时,ApplicationMaster 监视容器直到完成。当应用程序完成时,ApplicationMaster 从 ResourceManager 注销其容器,执行周期就完成了。
大大减小了 JobTracker(也就是现在的 ResourceManager)的资源消耗,并且让监测每一个 Job 子任务 (tasks) 状态的程序分布式化了,更安全、更优美。
在新的 Yarn 中,ApplicationMaster 是一个可变更的部分,用户可以对不同的编程模型写自己的 AppMst,让更多类型的编程模型能够跑在 Hadoop 集群中,可以参考 hadoop Yarn 官方配置模板中的 mapred-site.xml 配置。
对于资源的表示以内存为单位 ( 在目前版本的 Yarn 中,没有考虑 cpu 的占用 ),比之前以剩余 slot 数目更合理。
老的框架中,JobTracker 一个很大的负担就是监控 job 下的 tasks 的运行状况,现在,这个部分就扔给 ApplicationMaster 做了,而 ResourceManager 中有一个模块叫做 ApplicationsMasters( 注意不是 ApplicationMaster),它是监测 ApplicationMaster 的运行状况,如果出问题,会将其在其他机器上重启。
Container 是 Yarn 为了将来作资源隔离而提出的一个框架。这一点应该借鉴了 Mesos 的工作,目前是一个框架,仅仅提供 java 虚拟机内存的隔离,hadoop 团队的设计思路应该后续能支持更多的资源调度和控制 , 既然资源表示成内存量,那就没有了之前的 map slot/reduce slot 分开造成集群资源闲置的尴尬情况。
将JobTracker和TaskTracker进行分离,它由下面几大构成组件:
a. 一个全局的资源管理器 ResourceManager
b.ResourceManager的每个节点代理 NodeManager
c. 表示每个应用的 ApplicationMaster
d. 每一个ApplicationMaster拥有多个Container在NodeManager上运行

ResourceManager(RM):RM是一个全局的资源管理器,负责整个系统的资源管理和分配。它主要由两个组件构成:调度器(Scheduler)和应用程序管理器(Applications Manager,ASM)。
调度器 调度器根据容量、队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统中的资源分配给各个正在运行的应用程序。需要注意的是,该调度器是一个“纯调度器”,它不再从事任何与具体应用程序相关的工作,比如不负责监控或者跟踪应用的执行状态等,也不负责重新启动因应用执行失败或者硬件故障而产生的失败任务,这些均交由应用程序相关的ApplicationMaster完成。调度器仅根据各个应用程序的资源需求进行资源分配,而资源分配单位用一个抽象概念“资源容器”(Resource Container,简称Container)表示,Container是一个动态资源分配单位,它将内存、CPU、磁盘、网络等资源封装在一起,从而限定每个任务使用的资源量。此外,该调度器是一个可插拔的组件,用户可根据自己的需要设计新的调度器,YARN提供了多种直接可用的调度器,比如Fair Scheduler和Capacity Scheduler等。
应用程序管理器应用程序管理器负责管理整个系统中所有应用程序,包括应用程序提交、与调度器协商资源以启动ApplicationMaster、监控ApplicationMaster运行状态并在失败时重新启动它等。
ApplicationMaster(AM):用户提交的每个应用程序均包含一个AM,主要功能包括:
与RM调度器协商以获取资源(用Container表示);
将得到的任务进一步分配给内部的任务(资源的二次分配);
与NM通信以启动/停止任务;
监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务。
当前YARN自带了两个AM实现,一个是用于演示AM编写方法的实例程序distributedshell,它可以申请一定数目的Container以并行运行一个Shell命令或者Shell脚本;另一个是运行MapReduce应用程序的AM—MRAppMaster。
注:RM只负责监控AM,在AM运行失败时候启动它,RM并不负责AM内部任务的容错,这由AM来完成。
NodeManager(NM):NM是每个节点上的资源和任务管理器,一方面,它会定时地向RM汇报本节点上的资源使用情况和各个Container的运行状态;另一方面,它接收并处理来自AM的Container启动/停止等各种请求。
Container:Container是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当AM向RM申请资源时,RM为AM返回的资源便是用Container表示。YARN会为每个任务分配一个Container,且该任务只能使用该Container中描述的资源。
YARN的资源管理和执行框架都是按主/从范例实现的——Slave ---节点管理器(NM)运行、监控每个节点,并向集群的Master---资源管理器(RM)报告资源的可用性状态,资源管理器最终为系统里所有应用分配资源。
特定应用的执行由ApplicationMaster控制,ApplicationMaster负责将一个应用分割成多个任务,并和资源管理器协调执行所需的资源,资源一旦分配好,ApplicationMaster就和节点管理器一起安排、执行、监控独立的应用任务。
需要说明的是, YARN不同服务组件的通信方式采用了事件驱动的异步并发机制,这样可以简化系统的设计。

2.Yarn运行过程

Yarn的结构图如下所示:

                         

客户端首先会运行一个作业(job),然后连接ResourceManager来获得应用的ID,拿到应用ID之后将资源信息(包括数据切片信息,xml配置信息以及jar包等等)放到分布式文件系统临时目录上(例如HDFS),然后将作业提交给资源管理器ResourceManager ,紧接着资源管理器ResourceManager 会通过一个节点管理器NodeManager启动一个MRAPPMaster(应用管理员,统一负责应用程序的资源应用 ),MRAppMaster来检索切片信息(有多少个切片对应多少个Map,是为了获取这个作业要开启多少个并发执行的Map),然后请求资源管理器ResourceManager分配一份资源列表(哪些节点可用),然后启动其他节点管理器NodeManager,启动虚拟机,在虚拟机内再启动Yarn的子进程,通过Yarn子进程读取切片数据,开启MapReduce计算。

在Hadoop下通过start-yarn.sh开启Yarn,进而才能执行MapReduce计算。

注意:Yarn(第二代MapReduce框架)框架更改的MapReduce的资源调度,分发,监控的方式,并不是改了MapReduce计算模型,例如java web框架由ssh改变成了ssm,改变的只是框架,mvc的本质并没有改变。MapReduce计算模型Map端与Reduce端的执行依然是前面所说的,修改的只是资源调度,分发,监控的方式。

猜你喜欢

转载自blog.csdn.net/u011444062/article/details/80895698
今日推荐