MapReduce(二): Job的运行状态

时间:2022-04-07 00:42:52

MapReduce(二): Job的运行状态

提交一个Job后,其Job的状态变化过程如上图。一个Job包含Job Setup、Map、Reduce、Task、Task Clean、Job Cleanup 任务操作。JobTracker先分配一个Job Setup任务让TaskTracker执行,做Job的初始化工作。当Job Setup完成后Job进入RUNNING状态;执行完成后JobTracker分配Map任务给TaskTracker执行;Map 执行完毕后分配Reduce 任务;所有任务完成后,最后分配Job Cleanup任务,成功执行完Job Cleanup操作后Job进入SUCCEEDED状态;如果在执行Map或者Reduce任务期间发生错误,则JobTracker会分配TaskTracker执行Task Cleanup操作。如果Job在执行任务中发生错误,那么Job进入FAILED状态;如果对Job发起Kill操作,则Job进入KILLED状态。任务的执行顺序如下图所示:

MapReduce(二): Job的运行状态 

在每个任务的执行过程中,JobTracker和TaskTracker会共同维护一个Task的状态,以记录该任务的完成情况,每个Task的状态变迁过程见下图:

MapReduce(二): Job的运行状态

a)       UNASSIGNED

Job提交到在JobTracker后,初始化setup、cleanup、Map、Reduce任务时状态置UNASSIGNED状态。

b)       RUNNING

Task分配到TaskTracker,并由TaskTracker启动JVM执行该任务时状态置RUNNING状态。

c)       COMMIT_PENDING

任务成功执行完成,检查是否需要把临时目录下的结果转移到输出目录中,如需要则置COMMIT_PENDING状态,通常Map结果都放在本地,则不需要此状态,直接到SUCCEEDED状态,但在没有Reduce阶段,Map结束后处理结果直接放到输出目录时则需要此状态。

d)       SUCCEEDED

如果是非Reduce任务(没有输出结果,或者结果只是临时存放在本地)则处理结束后直接到SUCCEEDED,如果是Reduce任务则等待COMMIT结束后进入SUCCEEDED状态。

e)       FAILED_UNCLEAN

当在TaskTracker中执行Task发生错误,则把状态置为FAILD_UNCLEAN状态,由JobTracker对该Task分配Task Cleanup操作给TaskTracker执行。一个任务进入FAILED_UNCLEAN状态后,JobTracker发给TaskTracker分配TaskCleanup操作。

f)       KILLED_UNCLEAN

当在TaskTracker中执行Task时,用户发起Kill Task操作(Kill Job操作会先Kill所有Task),则把状态置为KILLED_UNLEAN状态,由JobTracker对该Task分配Task Cleanup操作给TaskTracker执行。一个任务进入KILLED_UNCLEAN状态后,JobTracker发给TaskTracker分配TaskCleanup操作。

g)       FAILED

当TaskTracker完成FAILED_UNCLEAN操作后,状态转为FAILED。

h)       KILLED

当TaskTracker完成FAILED_UNCLEAN操作后,状态转为KILLED。

a)      一个Job结束后,不管成功与否,JobTracker会给所有TaskTracker发送一个KillJob操作,以使同一个任务并发执行在不同TaskTracker上,但存在其中一个任务还未完成时做中止处理。

 

在一个任务的执行过程中,用户可以对某一个Task发起Kill操作和对一个Job发起Kill操作。

Kill Task: 如果该Task在SUCCEEDED、FAILED_UNCLEAN、KILLED_UNCLEAN状态之前对其发起Kill操作,那么该任务置为KILLED_UNCLEAN状态,随后JobTracker分配Task Clean操作给TaskTracker执行;如果Task已经在FAILED_UNCLEAN、KILLED_UNCLEAN、SUCCEEDED状态,则不做额外处理。

Kill Job: 更改Job的状态为Killed,使当前正在运行的任务无论其是否成功与否,在报告给JobTracker时都置为失败。并且把当前所有的任务除了Job Cleanup任务都置为killed,使之不再分配Task给TaskTracker。最后JobTracker分配TaskTracker执行完JobCleanup后整个Job完成,发起最后的KillJob操作给所有TaskTracker执行。