6.4 Job和Task运行时信息维护

JobTracker最重要的功能之一是状态监控,包括TaskTracker、Job和Task等运行时状态的监控,其中,TaskTracker状态监控比较简单,只要记录其最近心跳汇报时间和健康状况(由TaskTracker端的监控脚本检测,并通过心跳将结果发送给JobTracker)即可。本节重点分析Job和Task的监控方法,内容涉及作业描述模型、作业/任务运行时监控信息、作业/任务状态转换等。

6.4.1 作业描述模型

如图6-2所示,JobTracker在其内部以“三层多叉树”的方式描述和跟踪每个作业的运行状态。JobTracker为每个作业创建一个JobInProgress对象以跟踪和监控其运行状态。该对象存在于作业的整个运行过程中:它在作业提交时创建,作业运行完成时销毁。同时,为了采用分而治之的策略解决问题,JobTracker会将每个作业拆分成若干个任务,并为每个任务创建一个TaskInProgress对象以跟踪和监控其运行状态,而任务在运行过程中,可能会因为软件Bug、硬件故障等原因运行失败,此时JobTracker会按照一定的策略重新运行该任务,也就是说,每个任务可能会尝试运行多次,直到运行成功或者因超过尝试次数而失败。JobTracker将每运行一次任务称为一次“任务运行尝试”,即Task Attempt。对于某个任务,只要有一个Task Attempt运行成功,则相应的TaskInProgress对象会标注该任务运行成功,而当所有的TaskInProgress均标注其对应的任务运行成功后,JobInProgress对象会标识整个作业运行成功。

6.4 Job和Task运行时信息维护 - 图1

图 6-2“三层多叉树”作业描述方式

如图6-3所示,为了区分各个作业,JobTracker会赋予每个作业一个唯一的ID。该ID由三部分组成:作业前缀字符串、JobTracker启动时间和作业提交顺序,各部分通过“_”连接起来组成一个完整的作业ID,比如job_201208071706_0009,对应的三部分分别是“job”、“201208071706”和“009”(JobTracker运行以来第9个作业)。每个任务的ID继承了作业的ID,并在此基础上进行了扩展,它由三部分组成:作业ID(其中前缀字符串变为“task”)、任务类型(map还是reduce)和任务编号(从000000开始,一直到999999)。比如,task_201208071706_0009_m_000000,表示它的作业ID为task_201208071706_0009,任务类型为map,任务编号为000000。每个Task Attempt的ID继承了任务的ID,它由两部分组成:任务ID(其中前缀字符串变为“attempt”)和运行尝试次数(从0开始),比如,attempt_201208071706_0009_m_000000_0表示任务task_201208071706_0009_m_000000的第0次尝试。

6.4 Job和Task运行时信息维护 - 图2

图 6-3 Job/Task/TaskAttempt的ID继承关系