mapreduce作业运行机制
(1)作业提交
Job的submit()方法创建一个内部的JobSubmitter实例,并且调用其submitJobInternal()方法【步骤1】。作业提交后,waitForCompletion()每秒轮询作业的进度,如果发现自上次报告后有改变,便把进度报告到控制台。作业完成后,如果成功,就显示作业计数器,如果失败,则导致作业失败的被错误记录到控制台。
JobSubmitter所实现的作业提交过程:
(i)向资源管理器请求一个新应用ID,用于mapreduce作业ID【步骤2】
(ii)检查作业的输出说明
(iii)计算作业的输入分片,如果分片无法作业,作业就不要提交,错误抛回给mapreduce程序。
(iv)将运行作业所需要的资源复制到一个以作业ID命名的目录下的共享文件系统中【步骤3】
(v)通过调用资源管理器的submitApplication()的方法提交作业【步骤4】。
(2)作业初始化
资源管理器收到submitApplication()的消息后,将作业传给yarn调度器(scheduler),调度器分配一个容器,资源管理器在节点管理器的管理下在容器中启动application master的进程【步骤5】。
application master接受来自任务的进度和完成报告【步骤6】,application master对作业的初始化是通过创建多簿个记对象以保持对作业进度的跟踪来完成的。接下来,接受来自共享文件系统的、在客户端计算的输入分片【步骤7】,然后对每一个分片创建一个map任务对象以及由mapreduce.job.reduces属性确定的多个reduce任务对象。任务ID在此时分配。
application master必须决定如何运行构成MapReduce作业的各个任务,如果作业很小,就选择和自己在同一个jvm上运行。与在一个节点上顺序运行这些任务相比,当application master判断在新的容器中分配和运行任务的开销大于并行运行他们的开销时,就会发生这一情况,这样的作业成为uberized。作为Uber任务运行。
(3)任务的分配
如果作业不适合作为Uber任务运行,那么application master就会为该作业中的所有map任务和reduce任务向资源管理器请求容器【步骤8】
(4)任务的执行
一旦资源管理器的调度器为任务分配了一个特定节点上的容器,application master就通过节点管理器通信来启动容器【步骤9】,该任务由主类为YarnChild的一个Java应用程序执行。在它运行任务之前,首先将任务需要的资源本地化【步骤10】,最后运行map任务或reduce任务【步骤11】
(5)进度和状态的更新
(6)作业完成
关于失败
(1)任务运行失败
(2)application master运行失败
(3)节点管理器运行失败
(4)资源管理器运行失败
shuffle 和排序
mapreduce确保每个reducer的输入都是按键排序的。系统执行排序,将map输出作为输入传给reducer的过程成为shuffle。