作业描述模型
”三叉树“作业描述方式:
JobTracker为每个作业创建一个JobInProgress对象以跟踪和监控其运行状态,该对象存在于作业整个运行过程,作业提交时就创建,作业运行完成时就销毁。同时,为了采用分治的策略解决问题,JobTracker将每个作业拆分成若干个任务,并为每个任务创建一个TaskInProcess对象以跟踪和监控其运行状态,任务运行可能失败,JobTracker会按照一定的策略重新运行,所以每个任务可能尝试多次,直到成功,JobTracker每运行一次任务称为一次”任务运行尝试“,即Task Attempt,对于一个任务,只要有一个Task Attempt成功,相应的TaskInProcess就标注 该任务成功,当所有TaskInProcess均标注其对应的任务成功后,JobInProcess对象会标识整个作业运行成功。
为了区分各个作业,JobTracker赋予每个作业一个唯一的ID,命名方式:作业前缀字符串_JobTracker启动时间_提交顺序,比如job_201208071706_0009。
为了区分每个任务,每个任务的ID集成了作业的ID,在基础上扩展,由 作业ID、任务类型、任务编号组成,比如task_201208071706_0009_m_000000,m标识任务类型为map
每个Task Attempt的ID继承Task的ID,两部分组成,任务ID和运行尝试次数,比如attempt_201208071706_0009_m_00000_0,表示taskattempt_201208071706_0009_m_00000的第0次尝试。
JobInProcess
JobInProcess主要负责监控和跟踪作业运行状态,并为调度器提供最底层的调用接口。
JobInProcess维护了两种作业信息,静态和动态信息。
作业静态信息是作业提交时就确定的属性信息,比如MapTask个数,Reduce Task个数,每个Map Trask需要的内存量、每个Reduce Task需要的内存量等等。。
作业动态信息是作业运行过程中会动态变化的信息,对于发现TaskTracker、Job 、Task故障非常有用。比如正在运行的Map Task、Reduce Task、运行完成的Task、失败的Task Attempt。。。
TaskInProcess
维护Task运行过程中的全部信息,一个任务可能多次执行,所以多个Task Attempt,这些任务被同个TaskInProcess对象管理和跟踪,只要其中一个成功,TaskInProcess就会标注成功。
作业和任务状态转换图
作业状态转移由JobInProcess更新。
PREP->RUNNING:作业的setup task成功执行
RUNNING->SECCEEDED:作业的cleanup task执行成功
PREP->FAILED/KILLED:人为杀死作业
RUNNING->FALIED:人为杀死、作业失败都可能导致
- UNASSIGNED->RUNNING:任务初始化状态为UNASSIGNED,当JobTracker将任务分配给某个TaskTracker后,该TaskTracker会为它准备运行环境并启动它,之后该任务进入RUNNING状态。
- RUNNING->COMMIT_PENDING:该状态转换存在于产生最终结果的任务(Reduce Task或者map_only类型作业的Map Task)中,当任务处理完最后一条记录后进入COMMIT_PENDING状态,等待JobTracker批准其提交最后结果。
- RUNNING->SUCCEEDED:该状态转换存在于Map Task中,当Map Task处理完最后一条记录变意味着任务运行成功。
- RUNNING\COMMIT_PENDING->KILLED_UNCLEAN:TaskTracker收到来自JobTracker的KillTaskAction命令后,就会导致这个状态改变,通常产生的场景是人为杀死任务、同个TIP中有Task Attempt成功而杀死其他Task Attempt、TaskTracker超时
- RUNNING\COMMIT_PENDING-FAILED_UNCLEAN:本地文件读写错误、shuffle阶段错误、任务在一定时间内没有汇报进度、内存使用量超过期望值或者其他运行过程中出现的错误
- UNASSIGNED->FALIED/KILLED:人为杀死
- KILLED_UNCLEAN/FAILED_UNCLEAN->FAILED/KILLED:一旦任务进入KILLED_UNCLEAN/FAILED_UNCLEAN状态,接下来必进入FAILED/KILLED状态,以清理已经写入HDFS上的部分结果。
- SUCCEEDED->KILLED:一个TIP已经有一个Task Attempt完成,备份任务也汇报成功,则备份任务将杀死某个Task
- SUCCEEDED/COMMIT_PENDING_FAILED:Reduce Task从Map Task远程读取数据时,发现数据损坏或者数据丢失,则将对应的Map Task状态标注为FAILED以便重新得到调度。