上篇文章hadoop之mapreduce详解(基础篇)我们了解了mapreduce的执行过程和shuffle过程,本篇文章主要从mapreduce的组件和输入输出方面进行阐述。
一、mapreduce作业控制模块以及其他功能
小说阅读网 https://www.7wx.org/mapreduce包括作业控制模块,编程模型,数据处理引擎。这里我们重点阐述作业控制模块MRAppMaster。
1.1、MRAppMaster的构成
MRAppMaster主要有如下几个组件构成,如下图所示:
1、ContainerAllocator:与resourcemanager通信,为mapreduce申请资源,作业的所需资源描述为<priority,hostname,capability,containers,relax_locality>5元组格式,分别表示作业的优先级,期望资源所在的节点,资源量,container数目,是否松弛本地性。ContainerAllocator周期性的通过RPC与resourcemanager通信,而resourcemanager则通过心跳应答的方式为之返回所需的container列表,完成的container列表等信息。
ContainerAllocator工作流程:
步骤1:将Map Task的资源需求发送给RM;
步骤2:如果达到了Reduce Task的调度条件,则开始为Reduce Task申请资源;
步骤3:如果为某个Task申请到了资源,则取消其他重复资源的申请。由于在HDFS中,任何一份数据通常有三个备份,而对于一个任务而言,考虑到rack和any级别的本地性,它可能会对应7个资源请求
步骤4:如果任务运行失败,则会重新为该任务申请资源;
步骤5:如果一个任务运行速度过慢,则会为其额外申请资源以启动备份任务(如果启动了推测执行功能);
步骤6:如果一个节点失败的任务数目过多,则会撤销对该节点的所有资源的申请请求
2、ClientServer:实现了MRClientprotocol协议,客户端可以通过该协议获取到作业的执行状态(不需要通过resourcemanager)和控制作业(比如杀死作业,改变作业的优先级等)
3、Job:是一个mapreduce作业,负责监控作业的运行状态,维护一个作业的状态机,实现异步执行各种作业的相关操作
4、Task:一个mapreduce作业中一个任务,负责监控一个任务的运行状态,维护一个任务的状态机,实现异步执行各种任务的相关操作。
5、TaskAttempt:表示一个运行实例
6、TaskCleaner:负责清理失败任务或者杀死任务使用的目录和产生的临时结果,维护一个线程池和一个共享队列,异步删除任务产生的垃圾数据
7、Speculator:完成推测执行功能,当一个任务在执行速度上明显慢于其他任务的时候,Speculator将会启动一个功能相同的任务,先执行完成的任务会kill掉没执行完的那个作业。
8、ContainerLauncher:负责与NodeManager通信,以启动container
9、TaskAttempListener:负责各个任务的心跳信息,如果一个任务一段时间内未汇报心跳信息,则认为该任务死掉了,会将其从系统中移除。
10、JobHistoryEventHandler:负责各个作业的事件记录日志,比如作业的创建,运行等,都会写入hdfs的指定目录下,对作业的恢复很有用。
1.2、mapreduce客户端
是用户和yarn通信的唯一途径,通过该客户端,用户可以向yarn提交作业,获取作业的运行状态,以及控制作业(杀死作业或者任务),该客户端设计到两个通信协议:
ApplicationClientProtocol:resourcemanager实现了该协议,客户端需要通过该协议提交作业,杀死作业,改变作业的优先级等操作
MRClientProtocol:当作业启动Application Master后,会启动MRClientServer服务,该服务实现了MRClientProtocol协议,从而允许用户直接通过该协议直接与Application Master通信,获取作业的执行状态和控制作业,减轻resourcemanager的压力。
1.3、MRAppMaster工作流程
作业的运行分为local模式,yarn的uber模式和yarn的非uber模式:
首先看local模式和yarn模式的选择:客户端通过JobClient提交作业时,会通过java标准库中的Serverloader动态加载所有的ClientProtocolProvider的实现。默认情况下有两种实现:LocalClientProcotolProvider和YarnClientProcotolProvider。如果在配置中参数mapreduce.framework.mode设置为yarn时,客户端则会采用YarnClientProcotolProvider,创建一个YarnRunner对象作为真正的客户端,这样就可以通过YarnRunner.submitJob方法提交给yarn作业了。在该方法的内部实现会进一步调用ApplicationClientProcotol的submitApplication方法,提交作业给Resourcemanager。源码详情可见:hadoop2.7之作业提交详解(上)
uber模式和非uber模式的选择:
uber模式是小作业的一个优化,MrAppMaster不会再为每一个任务申请资源,而是让其重用一个container,map和reduce会在同一份资源上串行执行。
uber模式条件:
mapreduce.job.ubertask.enable #是否启用uber模式
mapreduce.job.ubertask.maxmaps #ubertask的最大map数 (默认9)
mapreduce.job.ubertask.maxreduces #ubertask的最大reduce数 (默认1)
mapreduce.job.ubertask.maxbytes #ubertask最大作业大小 (默认为block.size)
map和reduce使用的资源不得超过MRAppMaster可使用的资源