1.作业提交
- 提交作业 job 后,job.waitForCompletion(true)调用 monitorAndPrintJob()方法每秒轮询 作业进度,如果发现自上次报告后有改变,便把进度报告给控制台。Job 的 submit()方法 创建一个内部的 JobSubmitter 实例,并调用其 submitJobInternal 方法(步骤 1)。作业 完成后,如果成功,就显示计数器;如果失败,这将导致作业失败的错误记录到控制台。
JobSubmitter 所实现的作业提交过程如下所述:
- 向资 ResourceManager 源管理器请求一个新作业的 ID,用于 MapReduce 作业 ID。
- 作业客户端检查作业的输出说明,计算输入分片 splits 并将作业资源(包括作业 Jar 包、 配置文件和分片信息)复制到 HDFS
- 通过调用资源管理器上的 submitApplication()方法提交作业
2.作业初始化
- 资源管理器 ResourceManager 收到调用他的 submitApplication()消息后,便将请求传 递给调度器(scheduler)。调度器分配一个容器(Container),然后资源管理器在节点 管理器(NodeManager)的管理下载容器中启动应用程序的 master 进程(步骤 5a 和 5b)
- MapReduce 作业的 application master 是一个 Java 应用程序,它的主类是 MRAppMaster。 它对作业进行初始化:通过创建多个簿记对象以保持对作业进度的跟踪,因为它将接受 来自任务的进度和完成报告(步骤 6)。
- 接下来,它接受来自共享文件系统的在客户端计算的输入分片(步骤 7)。对每一个分 片创建一个 map 任务对象以及由 mapreduce. job.reduces 属性确定的具体数量的 reduce 任务对象。
3.任务分配
- AppMaster 为该作业中的所有 map 任务和 reduce 任务向资源管理器请求容器。
4.任务执行
- 一旦资源管理器的调度器为任务分配了容器,AppMaster 就通过与节点管理器 NodeManager 通讯来启动容器(步骤 9a 和 9b)。
- 该任务由主类为 YarnChild 的 Java 应用程序执行。在它允许任务之前,首先将任务需要 的资源本地化,包括作业的配置、JAR 文件和所有来自分布式缓存的文件.
- 最后运行 map 任务或 reduce 任务。
5.进度和状态更新
- 在 YARN 下运行时,任务每 3 秒钟通过 umbilical 接口向 APPMaster 汇报进度和状态。客户端每一秒钟(通过 mapreduce.client. Progressmonitor.pollinterval 设置)查询一次 AppMaster 以接收进度更新,通常 都会向用户显示。
6.作业完成
- 除了向 AppMaster 查询进度外,客户端每 5 秒还通过调用 Job 的 waitForCompletion() 来 检 测 作 业 是 否 完 成 。 查 询 的 间 隔 可 以 通 过 mapreduce.client.completion.pollinterval 属 性 进 行 设 置 。 作 业 完 成 后 , AppMaster 和任务容器清理器工作状态