运行机制主要包括以下5
个实体:
客户端:提交MapReduce作业;
YARN 资源管理器(ResourceManager,RM):负责协调集群上计算机资源的分配;
YARN 节点管理器(NodeManager,NM):负责启动和监视集群中机器的计算容器(container);
MapReduce的application master(一个Java 应用程序,MRAppMaster是其主类):负责协调MapReduce作业的任务,它和MapReduce任务在容器中运行,这些容器由RM分配并由NM进行管理。
主要过程如下图所示,图片来自《Hadoop权威指南》
作业的提交
- 客户端
启动一个Job
; - 客户端
向RM请求一个新的作业
,随后RM向客户端返回一个作业ID和资源的提交路径
; - 客户端
将Job所需要的资源
(作业JAR文件、配置文件和计算所得的输入分片)复制到一个以作业ID命名的目录下的共享文件系统
; - 客户端向RM
提交Job
。
作业的初始化
RM
收到请求之后,并将请求传递给YARN调度器(scheduler),调度器分配一个容器
,然后RM在NM的管理下在容器中启动application master的进程
;MRAppMaster对作业进行初始化
,创建多个对象对作业进行跟踪;MRAppMaster从共享文件中获取分片信息,每一个分片创建map任务以及指定的reduce任务,任务ID在此时分配
;如果作业很小
(少于10个mapper且只有1个reducer且输入大小小于一个HDFS块的作业),会与MRAppMaster在同一个JVM上运行
(在新的容器中分配和运行任务的开销大于并行运行它们的开销,uber任务);
任务的分配
- 若作业不适合作为uber任务运行,那么
application master就会为该作业的所有map任务和reduce任务想RM请求容器
,先
处理map任务
请求(map任务必须在reduce的排序阶段能够启动前完成),再reduce
;reduce任务能够在集群中任意位置运行,但map任务
的请求有着数据本地化局限(任务在分片驻留的同一节点上运行)
任务的执行
- 一旦RM的调度器为
任务分配了
一个特定节点上的容器
,application master就通过与NM通信来启动容器,这些任务由YarnChild进程执行; - NM从共享文件系统获得Job相关资源
- 运行map和reduce任务
进度和状态的更新
任务状态周期性向application master汇报,客户端定期轮询application master以接收最新状态
;
作业的完成
- 当application master收到作业最后一个任务已完成的通知后,便把作业的状态设置为“成功”;Job轮询状态时,便知道任务已经完成;再就是application master会发送一个HTTP作业通知,客户端通过mapreduce.job.end-notification.url属性进行设置;
- 作业完成,application master和任务容器清理其工作状态(中间输出将被删除)。