mapreduce基于yarn的资源调度,任务调度过程,mapreduceyarn



 

名称 功能
The client 提交MapReduce job
The YARN resource manager 协调(coordinate)集群上分配的计算资源
The YARN node manager 启动并监控在集群上的计算容器
The MapReduce application master 协调(coordinate)运行MapReduce job 的task
The distributed filesystem(HDFS) 存储文件供其他实体共享job 文件

MapReduce任务由YARN resource manager调度,由YARN node manager管理(managed)。


ResourceManager:是YARN资源控制框架的中心模块,负责集群中所有的资源的统一管理和分配。它接收来自NM(NodeManager)的汇报,建立AM,并将资源派送给AM(ApplicationMaster)。

NodeManager:简称NM,NodeManager是ResourceManager在每台机器的上代理,负责容器的管理,并监控他们的资源使用情况(cpu,内存,磁盘及网络等),以及向 ResourceManager提供这些资源使用报告。

ApplicationMaster:以下简称AM。YARN中每个应用都会启动一个AM,负责向RM申请资源,请求NM启动container,并告诉container做什么事情。

Container:资源容器。YARN中所有的应用都是在container之上运行的。AM也是在container上运行的,不过AM的container是RM申请的。


1.  Container是YARN中资源的抽象,它封装了某个节点上一定量的资源(CPU和内存两类资源)。

2.  Container由ApplicationMaster向ResourceManager申请的,由ResouceManager中的资源调度器异步分配给ApplicationMaster;
3. Container的运行是由ApplicationMaster向资源所在的NodeManager发起的,Container运行时需提供内部执行的任务命令(可以是任何命令,比如java、Python、C++进程启动命令均可)以及该命令执行所需的环境变量和外部资源(比如词典文件、可执行文件、jar包等)。
另外,一个应用程序所需的Container分为两大类,如下:
       (1) 运行ApplicationMaster的Container:这是由ResourceManager(向内部的资源调度器)申请和启动的,用户提交应用程序时,可指定唯一的ApplicationMaster所需的资源;
       (2) 运行各类任务的Container:这是由ApplicationMaster向ResourceManager申请的,并由ApplicationMaster与NodeManager通信以启动之。
以上两类Container可能在任意节点上,它们的位置通常而言是随机的,即ApplicationMaster可能与它管理的任务运行在一个节点上。


整个MapReduce的过程大致分为 Map-->Shuffle(排序)-->Combine(组合)–>Reduce

 

下图表面Hadoop如何跑 MapReduce job

1.job提交 (在client端的client JVM中进行)

job提交时做的事情:

1.向resource manager 申请一个新的application ID,作为MapReduce job ID(上图中的step 2)

2.检查输出路径。如果输出路径已经存在,job将不会被提交,并且抛出错误。(因为MapReduce几乎都是比较耗时的任务,所以越早发现问题越好)

3.input划分。如果不能正常划分的话(如输入路径不存在,划分的小文件太多等原因),job将不会被提交,并且抛出错误。

4.拷贝运行job所需的资源。拷贝包括job JAR file、配置文件、划分好的输入数据到共享的文件系统中根据job ID命名的directory(上图中step 3)(其中jar包可能会有多个拷贝,可通过配置mapreduce.client.submit.file.replication来控制)

5.调用submitApplication()方法来提交任务给resource manager(上图中step 4)

 

2.job初始化

当resource manager 接收到提交的job时,它将job转给YARN scheduler进行调度,scheduler将为job分配一个容器,并启动application的主进程,此进程由node manager管理(上图中step 5a 和step 5b )。

为每一个split创造一个个map。

task object 并创建一定数量的reduce task object(由mapreduce.job.reduces 属性决定)同时task id此时被分配。

如果job足够小,application master将选择在自己的JVM中运行此Job。这种类型的job叫做uberized or run as an uber task。

 

3.Task 分派

如果job不满足uberize条件(small job 少于10个mapper 只有1个reducer 并且输入小于一个HDFS block)时,application master想resource manager申请来运行所有map和reduce的容器(上图中step 8)。其中map tasks 先分配,即比reduce的优先级要高,因为所有的map 任务要在sort阶段之前进行完,,比reduce要早。直到map任务完成5%才开始给reduce分配容器。

 

4.task 执行

一旦task在某个特定的node上由resource manager 调度分配了执行时所需的资源,AP(application master)就启动容器并与node manager通信(step 9a step 9b)。

任务将由主类叫YarnChild的java application执行。

在task执行之前,它所需的资源(包括job configuration JAR files等)将会被本地化,也就是拷贝到执行它的node上,然后开始执行map或者reduce(step11)

YarnChild跑在一个专用的JVM上边,所以用户程序的bugs将不会影响到node manager。

相关内容

    暂无相关文章