yarn 升级_Hadoop介绍 (四)——YARN工作原理

YARN工作原理

YARN的加入,弥补了经典Hadoop模型在扩展性,效率上和可用性等方面存在的明显不足,可以说它是Apache对Hadoop1进行升级改造。YARN的引入主要两个重要的变更:一个是HDFS的NameNode可以以集群的方式部署,增强了NameNode水平的扩展能力和高可用性,分别是HDFS Federation与HA,二是MapReduce将Hadoop1时代的JobTracker中的资源管理和任务生命周期管理(包括定时触发及监控),拆分两个独立的组件(Resource Manager 和Application Master),并更名为YARN(yet Another Resource Negotiator)。YARN 仍然是master/slave的架构,其中ResourceManager充当了master的角色,NodeManager充当了slave的角色,Resource Manager 负责对多个NodeManager的资源进行统一管理和调度。

YARN on HDFS的工作原理

HDFS是典型的master/slave结构,它负责大数据存储的分布式系统,Client ,NameNode 和DataNode之间进行交互完成的Hadoop集群数据的存储和读取等操作。

c5c9be35284915ae1c8dc141ee421ce2.png

从这幅图可以看到,Metadata节点在保证集群数据安全上起到至关重要的作用。它与Name node保持通信,并且按照一定时间间隔保持文件系统元数据的快照。当NameNode发生故障的时候,需要手工将保存元数据快照恢复到重新启动的NameNode中,降低了数据丢失的风险。由于Secondary NameNode与NameNode进行数据同步备份时候,总会存在一定的延时,如果NameNode失效时有部分数据还没有同步到SecondaryNameNode上,就极有可能存在数据丢失的问题。HDFS1时代的架构关系主要分为两层。此时Hadoop1x中的NameNode只可能有一个,HDFS架构包含两层,即NameSpace和BlockstorageService.

Namespace层包含目录,文件及块的信息,它支持所有Namespace相关文件系统的操作,如创建,删除,修改以及文件和目录的列举。

1.Block Management (块管理):在NameNode中完成,通过处理registrations和心跳机制维护集群中的DataNode的基本成员关系。它支持数据块相关操作,如创建,删除,修改和获取块的位置以及管理副本的复制和存放。

2.Storage(存储):存储实际的数据块并提供数据块的的读写服务。

当前的HDFS架构只允许整个集群中存在一个单独的NameSpace,该节点管理这个NameSpace.该种结构下Blockstorage和NameNode 高度吻合,HDFS的DataNode可以解决在集群动态中增加或者横向扩展问题,但是NameNode不可以。当前NameSpace只能被存放在单个NameNode上面。而NameNode内存中储存了整个分布式文件系统的元数据信息,这就限制了集群中的数据块,文件和目录的数目。从性能上来讲,单个NameNode上的资源有限,进而限制了文件操作过程中的吞吐量和元数据的数目。从业务的独立性来讲,单个NameNode也难以做到业务隔离,使集群难以分享。

为了解决HDFS1的不足,HDFS2的NameNode可以以集群的方式部署,增加了NameNode的水平扩展性和高可用性,分别是HDFS Federation与HA(High Availability)

HDFS Federation 

HDFS Federation 在现有HDFS基础上添加了对多个NameNode/NameSpace的支持,可以同时部署多个NameNode,这些NameNode之间相互独立,彼此之间不需要协调,DataNode同时在所有NameNode中注册,作为它们的公共储节点,定时向所有这些NameNode发送心跳块使用情况的报告,并处理所有NameNode向其发送的指令。

该架构引入了两个新的概念——存储池块(Block Pool)和集群ID(Cluster ID the )

存储池块:是一个属于单个的NameSpace中的块的集合。其中DataNode存储者集群中所有BlockPool。BlockPool的管理者都是相互独立的。这就意味着一个NameSpace可以为新的Block形成新的ID,不需要其他NameSpace协调。一个NameNode的aNode失败不会导致DataNode的失败,这些DataNode 还可以服务其他的NameNode.一个NameSpace和它的Blockpool一起被称为命名空间向量,这个是一个独立的管理单元。当一个NameNode被删除的时候,对应的Blockpool也会被删除,当集群升级时,每一个命名空间向量也会进行升级。

             82ed05b2b9effdbc13cd8225003f4fe3.png                                                                                集群ID(Cluster ID):一个新的标识Cluster ID添加到集群,用来标识所有的节点,当NameNode被格式化时,该标识将自动创建ClusterID,这个ID用来区分集群中的NameNode.

HDFS Federation的好处很明显:1.命名空间的扩展,改进了对于集群HDFS上数量增加时仍然用一个NameNode进行管理的弊端。横向扩展可以把一些大的目录分离出去,使得每个NameNode下的数据更加精简。2.当NameNode所有的数据量达到一个非常大的数量级的时候,单个NameNode的处理压力过大,容易处于繁忙的状态,从而影响集群的吞吐量。HDFS Federation 下多个Name Node工作机制分解了这样的压力。3.多个命名空间可以更好的隔离各自命名空间内的任务,除了一些必要的关键任务处理外,许多本地特性的普通任务因得到屏蔽而互不干扰 。                                                                                                                      HA

HDFS Federation 通过多个NameNode/Name Space把元数据的存储和管理分散到多个节点中,使NameNode/NameSpace可以通过增加机器来进行水平扩展,所有的NameNode共享所有的NameNode存储资源,一定程度上解决了有限的节点资源,如内存受限问题。而HA存在的意义就是通过主备NameNode解决单点故障的问题。在Hadoop HA中可以同时启动两个Name Node。其中一个处于工作状态,一个处于随时待命的状态。     

                          d989cefcaa0daa0e10c880ce948a0e33.png                  图中两个NameNode,一个处于活跃状态,一个处于待机状态,这两个NameNode之间通过共享存储,同步edits信息,保证数据状态的一致。NameNode之间通过NetworkFilesystem(NFS)或者Quorum Journal Node(JN)共享数据,其中NFS是通过Linux共享的文件的系统,属于操作系统层面的配置,JN是Hadoop自身的机制,属于软件层面的配置。DataNode同时向两个NameNode汇报块信息,是Standby NameNode保持集群最新状态的必要步骤。同时,系统使用ZooKeeper(ZK)进行心跳监测监控,心跳不正常的时候,活跃的NameNode判断失效并会自动切换待机NameNode为Active状态,这样就完成了两个NameNode之间故障时的热切换操作。  

  MapReduce on YARN的工作原理                        MapReduce是Hadoop平台分布式计算的框架,主要通过Mapper 和Reducer框架的程序编写完成分布式计算的功能。

这里有一个很重要的知识点,这些程序编写后如果提交到平台,又是如何工作的?答案是通过Job对象上的submit()方法来调用,运行MapReduce作用,也可以通过调用waitForCompletion()方法提交以前没有提交过的作业,并等待它的完成。在MapReduce1版本中,mapred.job.tracker决定了MapReduce应用的执行方式:属性为local(默认),使用本地的作业运行器,运行器在单个JVM上运行整个作业;如果设为“主机名:端口”,该配置的属性被解释为JobTracker地址,运行器将作业提交给该地址JobTracker运行。mapreduce.framework.name属性设置为local,表示本地的作业运行器;设置为YARN,表示在YARN的环境下运行。与HDFS相似,由于YARN的引入,由于YARN的引入,MapReduce1时代发生了局部的改造工程,JobTracker中的资源管理以及任务生命周期管理(包括定时触发及监控)拆分成两个独立的组件(ResourceManager 和Application Master ),并更名为YARN MapReduce.

JobClient :基于MapReduce接口库编写的客户端程序,负责提交MapReduce作业。

JobTracker:一个Hadoop集群中只有JobTracker,是NameNode节点上的守护进程。它是各个MapReduce 模块之间的协调者,负责协调MapReduce 作业执行,例如:需要处理哪些文件,分配任务的Map和Reduce执行节点,监控任务的执行,重新分配失败的任务等。

TaskTracker:执行由JobTracker分配的任务,每个TaskTracker 可以启动一个或者多个Map Task和Reduce Task,负责具体执行Map任务和Reduce任务的程序。同时TaskTracker与JobTracker之间通过心跳(HeartBeat)机制保持通信,以维护整个集群的运行状态。

下面介绍一下MapReduce作业的具体工作过程

1.作业提交

第1步至第2步,在客户端,用户编写的MapReduce程序启动一个JobClient的实例,用以开启整个MapReduce作业(job),此时JobClient会通过getNew JobID()接口向JobTracker发出请求,以获得一个新的作业(job)ID,用以标识本次MapReduce作业。JobClient会检查本次作业指定的输入数据和输出目录是否正确。如果没有指定输出目录或输出目录已经存在,作业不提交,同时会把该信息返回给MapReduce程序。计算作业的分片信息,如果分片无法计算(如输入路径不存在等),作业就提交并将错误返回给MapReduce程序。计算作业的分片信息,如果分片无法计算(如输入路径不存在等),作业信息错误将返回给MapReduce程序。

第3步,如果检查无误,JobClient将运行作业需要的相关资源,包括本次作业相关的配置文件,输入数据分片的质量,以及包含Mapper和Reducer类的jar文件,并存放到HDFS中属于JobTracker的以JobID命名的目录下,一些文件(如jar文件)可能以冗余备份的形式被存放在多个节点上。

第4步,完成上述的准备工作后,JobClient通过调用JobTracker的submitJub()方法发出作业提交的请求。        (2)作业的初始化

第5步,当JobTracker接收到SubmitJob()方法的调用后,可以作为主控节点,JobTracker有可能会收到多个JobClient发出的作业请求,因此JobTracker实现了一个队列机制处理多个请求,并把这些调用请求放入一个内部队列,由作业调度器进行调度,并对其初始化,以完成作业的初始化工作。作业的初始化主要是创建一个代表此作业的运行对象,作业运行对象封装了作业包含的任何和任务的运行状态记录的信息,以便后续跟踪相关任务的状态和执行进度。

第6步,为了创建任务的执行列表,作业调度器先从HDFS中的共享文件获取JobClient,放好的数据已经计算好分片信息,然后根据分片信息建Map任务(通常一个分片一个Mapper任务 )的数量,并创建对应的一批TaskInProgress实例用监控和调度Map任务。同时根据JobConf配置文件中定义的数量生成Reduce任务和对应TaskInProgress实例。Reduce的数据量由Job的mapred.reduce.task属性决定,也可以通过job.setNumReduceTasks()方法来设定。                        (3)作业任务的分配

第7步,在TaskTracker和JobTracker间通过心跳机制维持通信。TaskTracker运行一个简单的循坏,定期地通过PRC发送心跳(heartbeat)给JobTracker,除了表明TaskTracker是否还存活外,询问有没有任务可做,同时也可以充当两者的信息通道。消息中包含了当前是否可以执行新的任务信息,如果JobTracker的作业列表不为空,则会获得TaskTracker发送的心跳信息将会获得JobTracker给它派送的任务。由于TaskTracker节点的计算能力(由内核数量和内存大小决定)是有限的,因此每个TaskTracker有两个固定数量的任务槽,分别对应Map任务槽,即只要有空闲的任务槽,就会分配一个Map任务,Map任务槽满了之后才分配Reduce任务。默认调度器在处理Reduce任务槽之前,会填满空闲的任务槽。因此,如果TaskTracker至少有一个闲置的Map任务槽,JobTracker会为它选择一个Map任务,否则选择一个Reduce任务。对于Map和Reduce任务,TaskTracker有固定数量的任务槽,二者是独立设置的。

(4)作业任务的执行

第8步,TaskTracker被分配了任务后运行该任务。在正式启动运行Map和Reduce任务前,它会事先做些准备工作:1.通过从共享文件系统把作业的jar文件复制到TaskTracker所在的文件系统,从而实现作业jar文件本地化。同时,TaskerTracker将应用程序所需要的全部文件从分布式缓存复制到本地磁盘。2.TaskTracker为任务新建一个本地工作目录,并把jar文件的内容压缩到这个文件夹下面3.TaskTracker新建一个TaskRunner实例来运行该任务。

TaskRunning在一个新的Java虚拟机(JVM)中根据任务类别创建出MapTask或ReduceTask进行运算。在新的java虚拟机中运行MapTask和ReduceTask的原因是避免这些任务异常,影响到TaskTracker的正常运行,并且每个任务都能执行安装和清理工作,它们和任何本身在JVM中运行,并由作业的OutputCommiter确定。

Map Task和Reduce Track会定时与TaskRunner进行通信以报告进度,直到任务完成。

第9步,Map任务的执行。在MapTaskTracker节点收到JobTracker分配的map任务后,系统将创建一个TaskInProgress对象实例,以调度和监控任务。然后将作业的jar文件和作业的相关配置文件从分布式文件储存系统系统中取出,并复制到本地的工作目录下,之后TaskTracker会新建一个TaskerRunner实例,启动一个单独的JVM,并在其中启动MapTask,执行用户指定的map()函数。MapTask计算获得的数据,定期存入缓存中,并在缓存满的情况下存入本地磁盘中。在任务执行时,MapTask定时与TaskTracker通信以报告任务进度,即任务完成的百分比情况,直到任务全部完成,此时所有的计算结果都会被存入到本地磁盘中。

第10步,Reduce任务的执行。在部分Map任务执行完成后,JobTracker按任务分配到Reduce所在的TaskTracker节点中.与Map任务启动过程类似,Reduce TaskTracker同样会生成单独的JVM中的ReduceTask以执行用户指定的reduce( )函数 。MapTask计算获得的数据,定期存入缓存中,并在缓存满的情况下存入到本地磁盘中。在任务执行时,MapTask定时与Tasker保持通信,系统会估计已处理Reduce输入的比例,报告执行的进度。直到任务全部完成。

(5)作业的完成                                                        在Reduce阶段执行过程中,每个Reduce会将计算结果输出到分布式文件存储系统HDFS中,当全部ReduceTask完成时。这些临时文件会最终输出文件。                                MapReduceYARN的工作机制                                    MapReduce1很好的解决了HDFS平台大数据的计算功能,它在模式设计上还不够灵活。例如,TaskTracker每次把Map和Reduce作业作为一个整体分成Map任务Slot和Reduce任务的slot,如果当前只有Map任务,那么Reduce任务Slot就会造成资源浪费。YARN的出现取消了Slot的概念,把JobTracker所负责的资源管理与作业调度分离。其中ResourceManager负责原来JobTracker管理应用程序计算资源的分配,监控和管理;AplicationMaster负责每一个具体应用程序的调度和协调。                                                                        5140c565432cb0a6dd98114620e1b31f.png     ResourceManager:简写为RM,负责管理所有应用程序计算资源的分配,是一个全局的资源管理系统。它定期接收来自NodeManager通过心跳机制汇报的关于本机的资源使用情况,对于具体的资源的处理交给ManagerNode自己实现。

ApplicationMaster:简写AM,每次提交一个应用程序便会产生一个用以跟踪和管理这个程序的AM。这个AM负责向ResourceManager申请资源,由AMLaucher与应对的NodeManager联系并启动常驻在NodeManager中的AM,这个AM获得的资源管理器Container,每一个任务对应一个Container,用于任务的运行,监控。此时如果任务运行失败,系统会重新为其申请资源和启动任务。由于不同的ApplicationMaster被分布在不同的节点上,因此它们之间不会相互影响。

NodeManager:简写为NM,相当于资源管理所在的机器的代理,负责本机程序的运行,资源管理和监控。集群中的每个节点都会有一个NM的守护进程,它会负责定时向RM汇报本节点上的资源的使用情况和Container的运行状态。                  MapReduceYARN的具体的工作过程。                           (1)作业的提交

第1步至第2步,运行Job的过程与MapReduce1时代一样,只是在MapReduce YARN时代,当mapreduce.framework.name设置为YARN时,提交的过程与MapReduce1相似,只是获取新的JobID的途径是从RN而不是JobTracker。之后Job检查作业输出并计算输入数据分片。

第3步,检查无误后,将作业的资源,包括本次作业相关的配置文件,输入数据分片的数据以及包含Mapper和Reduce类的jar文件,复制到HDFS上。

第4步,完成上述准备后,JobClient通用调用RM上的submitApplication()方法,发出作业提交的请求。

(2)作业初始化

第5步,RM收到调用它的submitApplication()消息后,将请求传递给调度器(Scheduler)。调度器分配一个容器,在 NM中的ContainerManager组件触发MLauncherEventTye.LAUNCH事件,并被主控点上的RM中的Application MasterLauncher捕获,创建新的AMLauncher实例,通过该实例调用AMLaunch()方法,在其内部调用ContainerManager.startContainer()方法启用该Container,进而在Container中启动应用程序的master进程。

第6步,MRAppMaster是MapReduce作业中的AM主类,由它对作业进行初始化。它将接受来自任务的进度和完成报告,通过创建多个薄记对象以保持对作业进度的追踪,以便后续跟踪相关任务的状态和执行进度。

第7步,接收来自共享文件系统在客户端计算输入分片的信息,依据分片数量确定创建Map任务的数量,一般情况下一个分片对应下一个Map。Reduce数量可由mapreduce.job.reduces属性值确定的

(3)作业任务的分配

第8步,如果作业不是User任务运行模式,那么AM会向RM请求,为该作业请求所有的Map任务和Reduce任务请求Container。YARN的调度器 (Scheduler)依据请求中包括的每一个Map任务的数据本地化信息进行数据信息本地化信息调度决策,确定任务的分配模式,并为任务准备了内存需求。

(4)作业任务的执行

第9步,RM的调度器为任务分配Container后,AM通过与NM定时通信来启动Container。

第10步,Container启动后,首先类似MapReduce1一样需要资源本地化,然后由主类的YARNChild的java应用程序执行任务。

(5)作业的完成

第12步,客户端第5秒向AM检查任务执行进度,同时向调用Job的waitForCompletion()方法检查作业是否完成。查询的间隔可以通过mapreduce.client.completion.pollinterval 属性进行设置。

综上,YARN的执行Job过程中,将一个业务计算任务(Job)分解成若干个Task来执行,执行的载体在YARN内部被称为容器,物理上是一个动态运行JVM过程,在TASK完成后,YARN会杀死Container,然后重新分配容器,进行初始化,运行新的任务,其实这个过程又点耗系统资源。                                                                                               -摘自《Hadoop集群程序设计与开发》的笔记,图片来源网络,侵权联系我删除

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值