MapReduce工作机制
书中第7章
MapReduce的作业运行机制
通过调用Job对象的submit()方法或者waitForCompletion()方法,我们可以运行一个MapReduce作业。那么在我们在写了简单一行的方法调用代码之后,底层的处理细节到底如何?
作业提交到运行的机制如下:
首先得明确在MapReduce作业运行过程中涉及到的几个实体:
- 客户端:用来MapReduce提交作业。
- YARN资源管理器:负责协调集群上计算机资源的分配。
- YARN节点管理器: 负责启动和坚实集群中机器上的计算容器(container),这里要和上面的“YARN资源管理器”进行区分,节点管理器负责管理存在于每一个节点上的容器。一个节点就是一台机器,存在于一个机架上。一个节点上可以运行多个容器。每个容器内运行计算任务。
- MapReduce的 application master:负责协调运行MapReduce作业的任务,这个master也是一个java程序,和执行MapReduce计算任务的程序一样都在某个节点的某个容器内运行。
整个MapReduce从提交到运行的机制可用下图来说明:(从网上借来的一张,和原书图是一摸一样的)
将整个工作流程划分为以下几个阶段:
阶段一:作业提交初始化
客户端在本地节点开始通过调用执行ToolRunner.run()函数之后,会向YARN资源管理器申请一个新的应用ID,作为本次MapReduce的作业ID。对应图中步骤2
之后会进行一系列的检查工作。检查输出说明,是否指定了输出目录或输出目录已经存在。检查作业的输入分片,若分片无法计算(输入路径错误导致)。以上检查若出现错误则返回错误给客户端的MapReduce程序。
将运行作业需要的资源(作业JAR包,配置文件,输入分片)复制到一个以作业ID命名目录下的共享文件系统中,对应步骤3,创建副本
最后通过调用YARN资源管理器的submitApplication()方法提交作业。对应步骤4
阶段二:作业初始化
在提交作业之后,YARN资源管理器在接收到了submitApplication()的请求消息,YARN资源管理器会将此请求传递给YARN调度器。调度器负责分配容器,紧接着YARN节点管理器会管理这个容器,YARN资源管理器在YARN节点管理器的管理之后,在此容器中启动 application master 进程。对应步骤5a和5b
application master实质就是一个java程序,该程序的主类的类名是MRAppMaster,master进程接收来自任务的进度以及完成报告,对应步骤6。master负责对作业初始化,它的做法是创建多个簿记对象来跟踪作业的进度。
初始化完成后,master接受来自阶段一中复制的副本的输入分片(input split),对应步骤7,然后为每一个分片创建一个map任务对象以及由 mapreduce.job.reduces属性指定的多个reduce对象。
master有关于MapReduce这个作业任务的决定权,如果作业很小,那么master会将作业放在和自己同一个JVM中运行。小作业判别标准是mapper任务小于10个并且只有1个reducer。
若作业不合适作为uber任务运行(即不是小作业),那么master会为作业中的所有的map和reduce任务向YARN资源管理器申请存放运行它们的容器。对应步骤8
阶段三:作业的运行
一旦YARN资源管理器为任务分配了一个特定节点上的容器,master就会通过于YARN节点管理器进行通信来启动容器。对应步骤9a和9b。该任务由主类为YarnChild的一个Java程序执行,在该类运行任务前,要先获得放在共享文件系统中的资源包括作业的配置,JAR文件等,对应步骤10。最后执行计算任务,对应步骤11。
经历上述三个主要阶段之后,我们的MapReduce作业将会被提交成功并划分为分解为若干个任务在不同的节点的容器上得到执行。
网友评论