在Hadoop中,咱们能够经过Job对象的submit()方法来运行MapReduce做业,也能够调用waitForCompletion()用于提交之前没有提交过的做业,并等待它的完成。其中,submit()方法调用封装了大量的处理细节,以下图所示:缓存
在最高层,有5个独立的实体。app
客户端,提交MapReduce做业;分布式
YARN资源管理器,负责协调集群上计算机资源的分配;oop
YARN节点管理器,负责启动和监视集群中机器上的计算容器(container);对象
MapReduce的application master,负责协调运行MapReduce做业的任务,它和MapReduce任务在容器中运行,这些容器由资源管理器分配并由节点管理器进行管理;blog
分布式文件系统(通常为HDFS),用来与其余实体间共享做业文件。排序
Job的submit()方法建立一个内部的JobSummiter实例,而且调用其submitJobInternal()方法。提交做业后,waitForCompletion()每秒轮询做业的进度,若是发现自上次报告后有改变,便把进度报告到控制台。做业完成后,若是成功,就显示做业计数器;若是失败,则致使做业失败的错误被记录到控制台。接口
JobSummiter所实现的做业提交过程以下:进程
① 向资源管理器请求爱一个新应用ID,用于MapReduce做业ID;事件
② 检查做业的输出说明;
③ 计算做业的输入分片;
④ 将运行做业所须要的资源(包括做业JAR文件、配置文件和计算所得的输入分片)复制到一个以做业ID命名的目录下的共享文件系统中;
⑤ 经过调用资源管理器的submitApplication()方法提交做业。
资源管理器收到调用它的submitApplication()消息后,便将请求传递给YARN调度器。调度器分配一个容器,而后资源管理器在节点管理器的管理下载容器中启动application master的进程。
MapReduce做业的application master是一个Java应用程序,它的主类是MRAppMaster。因为将接受来自任务的进度和完成报告,所以application master对做业的初始化是经过建立多个簿记对象以保持对做业进度的跟踪来完成的。
接下来,它接受来自共享文件系统的、在客户端计算的输入分片。而后对每个分片建立一个map任务对象以及由mapreduce.job.reduces属性肯定的多个reduce任务对象。任务ID在此时分配。
最后,在任何任务运行以前,application master调用setupJob()方法设置OutputCommitter。
application master为不适合做为uber运行的做业中的全部map任务和reduce任务向资源管理器请求容器。首先为Map任务发出请求,该请求优先级要高于reduce任务的请求,这是由于全部的map任务必须在reduce的排序阶段可以启动前完成。直到有5%的map任务已经完成时,为reduce任务的请求才会发出。
reduce任务可以在集群中运行,可是map任务的请求有着数据本地化局限。
一旦资源管理器的调度器为任务分配了一个特定节点上的容器,application master就经过与节点管理器通讯来启动容器。该任务由主类为YarnChild的一个Java应用程序执行。在它运行任务以前,首先将任务须要的资源本地化,包括做业的配置、JAR文件和全部来自分布式缓存的文件。最后,运行map任务或reduce任务。
一个做业和它的每一个任务都有一个状态,包括:做业或任务的状态、map和reduce的进度做业计数器的值、状态消息或描述。
任务在运行时,对其进度保持追踪。对map任务,任务进度是已处理输入所占的比例。对reduce任务,系统会估计已处理reduce输入的比例,整个过程分红三部分,与shuffle的三个阶段相对应(复制、排序、执行)。
任务也有一组计数器,负责对任务运行过程当中各个事件进行计数。当map任务或reduce任务运行时,子进程和父application master经过umbilical接口通讯。每隔3秒钟,任务经过这个umbilical接口向本身的application master报告进度和状态,application master会造成一个做业的汇聚视图。
当application master收到最后一个任务已完成的通知后,便把做业的状态设置为“成功”。而后,在Job轮询状态时,便知道任务已成功完成,因而Job打印一条消息告知用户,而后从waitForCompletion()方法返回。Job的统计信息和计数值也是在这个时候输出到控制台。
最后,做业完成时,application master和任务容器清理其工做状态,OutputCommitter的commitJob()方法会被调用。