MapReduce On YARN与MRv1在编程模型和数据处理引擎方面的实现是一样的,唯一不同的是运行时环境。不同于MRv1中由JobTracker和TaskTracker构成的运行时环境,MapReduce On YARN的运行时环境由YARN与ApplicationMaster构成,这种新颖的运行时环境使得MapReduce可以与其他计算框架运行在一个集群中,从而达到共享集群资源、提高资源利用率的目的。随着YARN的成熟与完善,MRv1的独立运行模式将被MapReduce On YARN所取代。
MRAppMaster是MapReduce的ApplicationMaster实现,它使得MapReduce应用程序可以直接运行于YARN之上。在YARN中,MRAppMaster负责管理MapReduce作业的生命周期,包括作业管理、资源申请与再分配、Container启动与释放、作业恢复等。下面将介绍MRAppMaster的基本构成。
1、MRAppMaster的基本构成
如下图所示,MRAppMaster主要由以下几种组件/服务构成。
ContainerAllocator。同ResourceManager通信,为MapReduce作业申请资源。作业的每个任务资源需求可描述为5元组(priority,hostname,capability,containers,relax_locality),分别表示作业优先级、期望资源所在的host、资源量(当前仅支持内存和CPU两种资源)、Container数目、是否松弛本地性。ContainerAllocator周期性通过RPC协议与ResourceManager通信,而ResourceManager则通过心跳应答的方式为之返回已经分配的Container列表、完成的Container列表等信息;
ClientService。ClientService是一个接口,由MRClientService实现。MRClientService实现了MRClientProtocol协议,客户端可通过该协议获取作业的执行状态(不必通过ResourceManager)和控制作业(比如杀死作业、改变作业优先级等);
Job。Job表示一个MapReduce作业,与MRv1的JobInProgress功能一样,负责监控作业的运行状态。它维护了一个作业状态机,以实现异步执行与各种作业相关的操作;
Task。Task表示一个MapReduce作业中的某个任务,与MRv1中的TaskInProgress功能类似,负责监控一个任务的运行状态。它维护了一个任务状态机,以实现异步执行与各种任务相关的操作;
TaskAttempt。TaskAttempt表示一个任务运行实例,它的执行逻辑与MRv1中的MapTask和ReduceTask运行实例完全一致,实际上,它直接使用了MRv1的数据处理引擎,但经过了一些优化。正是由于它与MRv1的数据处理引擎一样,对外提供的编程接口也与MRv1完全一致,这意味着MRv1的应用程序可直接运行于YARN之上;
TaskCleaner。TaskCleaner负责清理失败任务或者被杀死任务使用的目录和产生的临时结果(可统称为垃圾数据),它维护了一个线程池和一个共享队列,异步删除任务产生的垃圾数据;
Speculator。Speculator完成推测执行功能。当同一个作业的某个任务运行速度明显慢于其他任务时,Speculator会为该任务启动一个备份任务,让它与原任务同时处理同一份数据,谁先计算完成则将谁的结果作为最终结果,并将另一个任务杀掉。该机制可有效防止那些“拖后腿”任务拖慢整个作业的执行进度;
ContainerLauncher。ContainerLauncher负责与NodeManager通信,以启动一个Container。当ResourceManager为作业分配资源后,ContainerLauncher会将任务执行相关信息填充到Container中,包括任务运行所需资源、任务运行命令、任务运行环境、任务依赖的外部文件等,然后与对应的NodeManager通信,要求它启动Container;
TaskAttemptListener。TaskAttemptListener负责管理各个任务的心跳信息,如果一个任务一段时间内未汇报心跳,则认为它死掉了,会将其从系统中移除。同MRv1中的TaskTracker类似,它实现了TaskUmbilicalProtocol协议,任务会通过该协议汇报心跳,并询问是否能够提交最终结果;
JobHistoryEventHandler。JobHistoryEventHandler负责对作业的各个事件记录日志,比如作业创建、作业开始运行、一个任务开始运行等,这些日志会被写到HDFS的某个目录下,这对于作业恢复非常有用。当MRAppMaster出现故障时,YARN会将其重新调度到另外一个节点上。为了避免重新计算,MRAppMaster首先会从HDFS上读取上次运行产生的日志,以恢复已经运行完成的任务,进而能够只运行尚未运行完成的任务。
2、MapReduce客户端
MapReduce客户端是MapReduce用户与YARN以及MRAppMaster进行通信的唯一途径,通过该客户端,用户可以向YARN提交作业,获取作业的运行状态和控制作业(比如杀死作业、杀死任务等)。MapReduce客户端涉及两个RPC通信协议:
ApplicationClientProtocol。在YARN中,ResourceManager实现了ApplicationClientProtocol协议,任何客户端需使用该协议完成提交作业、杀死作业、改变作业优先级等操作;
MRClientProtocol。当作业的ApplicationMaster成功启动后,它会启动MRClientService服务,该服务实现了MRClientProtocol协议,从而允许客户端直接通过该协议与ApplicationMaster通信以控制作业和查询作业运行状态,以减轻ResourceManager的负载。
为了与MRv1的客户端兼容,MRAppMaster混合使用了继承和组合的设计模式。通过使用继承设计模式,MRAppMaster可保证它的对外接口与MRv1的一致,通过使用组合设计