7.4.4 杀死作业

杀死作业是通过JobTracker向TaskTracker发送KillTaskAction命令完成的。它是Hadoop最常见的行为之一,比如,任何一个作业成功运行完成后,JobTracker会向各个TaskTracker广播KillJobAction以清空各个节点上该作业的工作目录。此外,用户可以通过调用Shell命令“bin/hadoop job-kill<job-id>”杀死一个作业。本小节主要分析用户使用Shell命令杀死作业的过程,具体如图7-6所示。

7.4.4 杀死作业 - 图1

图 7-6 杀死作业序列图

用户输入一条“杀死任务”的Shell命令后,JobClient通过RPC函数KillJob向JobTracker发送杀死作业请求。JobTracker收到请求后,涉及的过程如下:

1)作业的JobInProgress对象将jobKilled变量置为true,并杀死该作业所有的job-setup task、map task和reduce task(注意:job-cleanup task保留)。

2)此后假设TaskTracker1第一个向JobTracker汇报心跳,则JobTracker将该作业的job-cleanup task封装成LaunchTaskAction命令,将该TaskTracker对应的已被杀任务封装成KillTaskAction命令,并把这些命令添加到心跳应答中返回给TaskTracker1。

3)对于接下来发送心跳的TaskTracker, JobTracker将对应的被杀死任务封装成KillTaskAction命令,并把这些命令添加到心跳应答中返回给这些TaskTracker。

4)TaskTracker1收到来自JobTracker的命令后,执行相应的操作:若为KillTaskAction命令,则进行的操作与“杀死任务”中的第3步类似,执行完命令后,将作业状态KILLED_UNCLEAN汇报给JobTracker;若为LaunchTaskAction命令,TaskTracker将创建JVM执行该任务,但由于该任务没有需要处理的数据,因此很快可以运行完成,任务完成后,其状态转化为SUCCEEDED,并由TaskTracker通过心跳告诉JobTracker。

5)其他TaskTracker收到JobTracker端的KillTaskAction命令后,进行与第4步类似的操作。

6)JobTracker收到TaskTracker汇报的心跳后,若心跳信息包含任务状态变为KILLED_UNCLEAN,由于任务所属作业已被杀死(jobKilled=true),则将任务由KILLED_UNCLEAN状态转化为KILLED状态;若心跳信息包含job-cleanup task运行成功(状态为SUCCEEDED),则向各个TaskTracker广播KillJobAction命令,以清理作业的工作目录和相关的内存结构(比如runningJobs)。