天天看点

MapReduce作业提交流程(详解)

文章来源:知乎

原文链接:  职业法师刘海柱

MapReduce作业提交流程(详解)
MapReduce作业提交流程(详解)

1、客户端,提交MapReduce作业

2、YARN的资源管理器(Resource Manager),协调集群中计算资源的分配

3、YARN的节点管理器(Node Manager),启动并监控集群中的计算容器

4、MapReduce的Application Master,协调MapReduce作业中任务的运行。Application Master和MapReduce任务运行于容器中,这些容器由resourcemanager调度,由nodemanager管理。

5、分布式文件系统(一般是HDFS),在组件之间共享作业数据。

Job对象的submit方法创建了一个内部的JobSubmitter实例并调用该实例的submitJobInternal方法。一旦提交了作业,waitForCompletion方法每秒钟轮询作业的执行进度,如果进度发生了变化,则向控制台报告进度。当作业成功完成,展示作业计数器的数据。否则展示作业失败的错误日志信息。

obSubmitter实现的作业提交的过程有如下几个步骤:

1、向resourcemanager申请一个新的application ID,用于MapReduce作业的ID

2、检查作业的输出。如果没有指定输出或者输出路径已经存在,则不提交作业,MapReduce程序抛异常

3、计算作业的输入切片。如果不能计算切片(比如输入路径不存在等),不提交作业,MR程序抛异常。

4、拷贝执行作业需要的资源到共享文件系统的以作业ID命名的目录中,这些资源包括作业的jar包,配置文件,计算好的输入切片。作业的jar包有一个很高的副本数量(mapreduce.client.submit.file.replication指定,默认值是10),这样当nodemanager如果运行作业中的任务,会有很多副本可以访问。

5、调用resourcemanager的submitApplication方法提交作业。

MR初始化

1、YARN为请求分配一个容器,resourcemanager通过容器所在节点上的nodemanager在该容器中启动application master进程。

2、MapReduce作业的application master是一个java app,主入口类是MRAppMaster。从HDFS抽取客户端计算好的输入切片,为每一个切片创建一个map任务对象,以及一定数量的reduce任务对象。

MR作业布置:

application master会为作业中所有的map任务以及reduce任务向resourcemanager请求容器。为map任务的请求会首先进行并且相对于reduce任务请求有更高的优先级。当map任务完成率达到了5%之后才会为reduce任务发送容器请求。

reduce任务可以运行于集群中的任意位置,而map任务会有本地读取数据的限制。移动计算而不是数据。数据本地。次之为机架本地。

请求会指定每个任务需要的内存和cpu资源。默认情况下为每个map任务或reduce任务分配1024MB的内存和一个虚拟核心。这些值对于每个作业都是可以配置的:mapreduce.map.memory.mb,mapreduce.reduce.memory.mb,mapreduce.map.cpu.vcores以及mapreduce.reduce.cpu.vcores。

MR作业任务执行:

一旦resourcemanager在一个节点上的一个容器中为一个任务分配了资源,application master与nodemanager通信,启动容器。任务通过一个java app来执行,该app的主入口类是YarnChild。在它可以开始任务的执行之前,它要本地化任务需要的资源,包括jar包,配置文件,以及分布式缓存中存储的其他共享文件。最后,它开始运行map任务或者reduce任务。

MR作业完成:

当作业的最后一个任务完成并通知application master,AppMaster就更改作业的状态为”successfully”。作业就打印信息告知客户端,客户端waitForCompletion方法返回。此时也会在控制台打印作业的统计信息和计数器的信息。

作业完成,application master所在容器和任务所在容器销毁工作状态(中间的输出结果删除)。作业的信息被作业历史服务器存档以备以后查询使用。

继续阅读