继续写笔记,清清脑子
在Hadoop2.0以后便不再有Tasktacker,也不会有JobTracker,而是以ResourceManger和ApplicationMaster代替,但是要想理清yarn的原理结构还必须从Hadoop1.0的TaskTracker和JobTracker说起。
Hadoop1.0的执行流程(我是搬运工。。。。。这段等我弄懂了再修改):
首先用户程序(JobClinet)提交一个job,job的信息会发送到jobTracker中,JobTracker是Map-Reduce框架的中心,他需要与集群中的机器定时通讯(hearbeat),需要管理那些程序应该跑在那些机器上,需要管理所有job失败、重启等操作。
TaskTracker是Map-Reduce集群中每台机器都有的一个部分,他做的事情主要是监视自己所在机器的资源情况,TaskTracker同时监控当前机器的tasks运行情况。TaskTracker需要把这些信息通过hearbeat发送给JobTracker,JobTracker会搜集这些信息已给新提交的job分配运行在那些机器上。
JobTracker在这里简直就是又当爹又当妈,又要分配资源,又要管理应用程序,又要处理异常,一旦JobTracker宕机出现单点故障,整个集群就要崩掉,这对生产环节来说简直就是灾难。JobTracker承担了太多的负担,也占用了很大的系统资源。并且在taskTracker端,以Map/reduce task的数据作为资源的表示过于简单,没有考虑到CPU/MEM的占用情况,如果两个大内存消耗的task被调度到了一块,很容易出现OOM。而且把资源强制划分为map task slot和reduce task slot,如果当系统中只有map task或者只有reduce task的时候,会变成资源的浪费,也就是出现集群资源利用的问题。
在这个时候yarn就隆重登场了,yarn将JobTracker的资源管理和任务调度/监控分为两个独立的组件:Scheduler 和 ApplicationsManager,原框架中核心的JobTracker和TaskTracker不见了,取而代之的是ResourceManager、ApplicationMaster与NodeManager三部分。
同样,首先来看下它的内部实现流程(我是搬运工):
1.客户端的mapreduce程序通过hadoop shell提交到hadoop的集群中.
2.程序会通过RPC通信将打成jar包的程序的有关信息传递给Hadoop集群中RM(ResourceManager),可称为领取JOBID的过程
3.RM根据提交上来的信息给任务分配一个唯一的ID,同时会将run.jar的在HDFS上的存储路径等信息发送给客户端.
4.客户端得到那个存储路径等信息之后,会相应的拼接出最终的存放路径目录,然后将run.jar分多份存储在HDFS目录中,默认情况下备份数量为10份.可配置.
5.客户端提交一些配置信息,例如:最终存储路径,JOB ID等.
6.RM会将这些配置信息放入一个队列当中,RM会根据相应的调度的算法来分配资源.
7.NM(NodeManager)和RM是通过心跳机制保持着通信的,NM会定期的向RM去领取任务.
8.RM会在任意的一台或多台的NM中,启动任务监控的进程Application Master.用来监控其他NM中YARN CHild的执行的情况
9.NM在领取到任务之后,得到信息,会去HDFS的下载run.jar.然后在本地的机器上启动YARN Child进程来执行map或者reduce函数.map函数的处理之后的中间结果数据会放在本地文件系统中的.
10.在结束程序之后,将结果数据写会HDFS中.整个流程大概就是这样子的.
从流程来了解各节点的功能:
1.客户端的mapreduce程序通过hadoop shell提交到hadoop的集群中.
2.程序会通过RPC通信将打成jar包的程序的有关信息传递给Hadoop集群中RM(ResourceManager),可称为领取JOBID的过程
3.RM更加提交上来的信息给任务分配一个唯一的ID,同时会将run.jar的在HDFS上的存储路径发送给客户端.
4.客户端得到那个存储路径之后,会相应的拼接出最终的存放路径目录,然后将run.jar分多份存储在HDFS目录中,默认情况下备份数量为10份.可配置.
5.客户端提交一些配置信息,例如:最终存储路径,JOB ID等.
6.RM会将这些配置信息放入一个队列当中,所谓的调度器.至于调度的算法,则不必深究.
7.NM(NodeManager)和RM是通过心跳机制保持着通信的,NM会定期的向RM去领取任务.
8.RM会在任意的一台或多台的NM中,启动任务监控的进程Application Master.用来监控其他NM中YARN CHild的执行的情况
9.NM在领取到任务之后,得到信息,会去HDFS的下载run.jar.然后在本地的机器上启动YARN Child进程来执行map或者reduce函数.map函数的处理之后的中间结果数据会放在本地文件系统中的.
10.在结束程序之后,将结果数据写会HDFS中.整个流程大概就是这样子的.
从实现过程了解各节点的作用:
1. ResourceManager(RM)
RM是一个全局的资源管理器,负责整个系统的资源管理和分配。它主要有两个组件构成:调度器(Scheduler)和应用程序管理器(Applications Manager,ASM)。
(1) 调度器(Scheduler)
调度器根据容量、队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统中的资源分配给各个正在运行的应用程序。需要注意的是,该调度器是一个“纯调度器”,它不再从事任何与具体应用程序相关的工作,比如不负责监控或者跟踪应用的执行状态等,也不负责重新启动因应用执行失败或者硬件故障而产生的失败任务,这些均交由应用程序相关的ApplicationMaster完成。调度器仅根据各个应用程序的资源需求进行资源分配,而资源分配单位用一个抽象概念“资源容器”(Resource Container,简称Container)表示,Container是一个动态资源分配单位,它将内存、cpu、磁盘、网络等资源封装在一起,从而限定每个任务使用的资源量。此外,该调度器是一个可插拔的组件,用户可根据自己的需求设计新的资源量。此外,调度器是一个可插拔的组件,用户可以根据自己的需要设计新的调度器,yarn提供了多种直接可用的调度器,比如Fair Scheduler和Capacity Scheduler等。
(2)应用程序管理器(Applications Manager)
应用程序管理器负责管理整个系统中所有应用程序,包括应用程序提交、与调度器协商资源已启动ApplicationMaster、监控ApplicationMaster运行状态并在失败时重新启动它等。
2. ApplicationMaster(AM)
用户提交的每个应用程序均包含一个AM,主要功能包括:
与RM调度器协商以获取资源(用Container表示);将得到的任务进一步分配给内部的任务;与NM通讯以启动/停止任务;监控所有任务运行状态,并在任务运行失败的时候重新为任务申请资源以重启任务。当前yarn自带了两个AM实现,一个用户演示AM编写方法的实例程序distributedshell,他可以申请一定数目的container以并运行一个shell命令或者shell脚本;另一个是运行MapReduce应用程序的AM—MRAppMaster。此外,一些其他的计算框架对应的AM正在开发中,比如open MPI、Spark等。
3. NodeManager(NM)
NM是每个节点上的资源和任务管理器,一方面,它会定时的向RM汇报本节点上的资源使用情况和各个container的运行状态;另一个方面,他接受并处理来自AM的container启动/停止各种请求。
4. Container
Container是yarn中的资源抽象,他封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当AM向RM申请资源时,RM为AM返回的资源便是Container表示的。Yarn会为每个任务分配一个Container,且该任务只能使用该Container中描述的资源。需要注意的是,Container不同与MRv1中的slot,他是一个动态资源划分单位,是根据应用程序的需求动态生成的。到目前为止,yarn仅支持CPU和内存两种资源,且使用了轻量级资源隔离机制Cgroups进行资源隔离。
Yarn是如何执行一个MapReduce job的?
首先,Resource Manager里的Application Manager会为每一个application(比如一个用户提交的MapReduce Job)在NodeManager里面申请一个container,然后在该container里面启动一个Application Master。container在Yarn中是分配资源的容器(内存、cpu、硬盘等),它启动时便会相应启动一个JVM。此时,Application Master便陆续为application包含的每一个task(一个Map task或Reduce task)向Resource Manager申请一个container。等每得到一个container后,便要求该container所属的NodeManager将此container启动,然后就在这个container里面执行相应的task。等这个task执行完后,这个container便会被NodeManager收回,而container所拥有的JVM也相应地被退出
参考文献:这个博客将的比较详细了
http://student-lp.iteye.com/blog/2158586