TaskTracker行为分析

来源:互联网 发布:淘宝网手工布鞋 编辑:程序博客网 时间:2024/06/13 13:10
Tasktracker通过心跳机制从Jobtracker端获取各种命令,包括启动新任务、提交任务、杀死任务、杀死作业和重新初始化等。在hadoop中,存在各种场景使得jobtracker下达这些命令。

1、启动新任务
tasktracker出现空闲资源后,会通过心跳从jobtracker端获取任务,并按照一定步骤启动该任务,之后一直监控并汇报其运行状态。直到它运行成功,
这里写图片描述
1、TaskTracker出现空闲资源,将空闲使用情况通过心跳汇报给Jobtracker
2、Jobtracker收到消息后,解析心跳信息,发现Tasktracker上有空闲的资源,则调用调度器模块的assignTasks()函数为该Tasktracker分配任务
3、Jobtracker将新分配的任务封装成一个或多个LaunchTaskAction()对象,将其添加到心跳应答中返回给Tasktracker
4、Tasktracker收到心跳后,解析出LaunchTaskAction对象,并创建JVM启动任务
5、当counter值或者进度发生变化时,任务通过RPC函数将最新counter值和进度汇报给Tasktracker
6、tasktracker通过心跳将任务的最新counter值和进度汇报给jobtracker

2、提交任务
任务提交过程是指任务处理完数据后,将最终计算结果从临时目录转移到最终目录的过程,需要注意的是,只有将输出结果直接写到HDFS上的任务才会经历该过程,在hadoop中有2种任务,一种是reduce task另一种是map-only类型作业的map task。
hadoop任务提交过程采用了两阶段提交协议实现,两阶段提交协议是分布式事务中经常采用的协议,它把分布式事务的某一个代理指定为协调者,所有其他代理称为参与者,同时规定只有协调者才有提交或撤销事务的决定权,而其他参与者各自负责在其本地执行写操作,并向协调者提出撤销或提交子事务的意向。
第一阶段(准备阶段): 各个参与者执行完自己的操作后,将状态变为”可提交”,并向协调者发送”准备提交”请求。
第二阶段(提交阶段) : 协调者按照一定原则决定是否允许参与者提交,如果允许,则向参与者发出”确认提交”请求,参与者收到请求后,把“可以提交”状态改为“提交完成”状态,然后返回应答;如果不允许,则向参与者发送”提交失败”请求,参与者收到该请求后,把”可以提交”状态改为”提交失败”状态,然后退出
这里写图片描述
1、Task Attempt 处理完最后一条记录后(此时数据写在临时目录{mapred.output.dir}/_temporary/_{taskid}下),运行状态由RUNNIING变为COMMIT_PENDING,并通过RPC将该状态和任务提交请求发给tasktracker
2、tasktracker得知一个task attempt状态为COMMIT_PENDING后,立刻缩短心跳间隔,以便快速将任务状态汇报给jobtracker
3、jobtracker收到心跳信息后,检查它是否为某个taskinProgress中第一个状态变为COMMIT_PENDING的task attempt,如果是则批准它进行任务提交,即在心跳应答中添加CommitTaskAction命令,以通知tasktracker准许该任务提交最终结果
4、tasktracker收到CommitTaskAction命令后,将对应任务加入可提交任务列表commitResponse中
5、Task Attempt通过RPC监测到自己位于列表commitResponse中后,进行结果提交,即数据从临时目录转移到最终目录(参数${mapred.outpuy.dir}对应的目录)中,并告诉tasktracker任务提交完成
6、tasktracker得知任务提交完成后,将该任务运行状态由COMMIT_PENDING变为SUCCEEDED并在下次心跳中将该任务汇报给jobtracker

3、杀死任务
hadoop中存在多种场景将一个任务杀死,它们涉及的过程基本相同,都是通过jobtracker向tasktracker发送KillTaskAction命令完成的,
这里写图片描述

用户输入hadoop job -kill-task 后,jobclient内部调用RPC函数killtask杀死该Task Attempt
1、jobtracker收到来自jobclient的杀死任务请求后,将该任务添加到待杀死任务列表taskstoKill中
2、之后某个时刻,Task Attempt 所在的tasktracker向jobtracker发送心跳,jobtracker收到心跳后,将该任务封装到KillTaskAction命令中,并通过心跳应答发送给tasktracker
3、tasktracker收到KillTaskAction命令后,将该任务从作业列表runningJobs中清除,并将运行状态从RUNNING转化成KILLED_UNCLEAN,同时通知directoryCleanupThread线程清理其工作目录,释放所占槽位,最后缩短心跳时间间隔,以便将该任务状态迅速通过带外心跳告诉jobtracker
4、jobtracker收到状态为KILLED_UNCLEAN的Task Attempt后,将其类型改为 task-cleanup task(这种任务的输入数据为空,但ID与被杀task attempt的ID相同,其目的是清理被杀task attempt已经写入HDFS的临时数据),并添加到待清理任务队列mapCleanupTasks/reduceCleanupTasks中,在接下来的某个tasktracker的心跳中,jobtracker将其封装到LaunchTaskAction中发送给Tasktracker
5、Tasktracker收到LaunchTaskAction后,启动JVM执行该任务,由于该任务属于task-cleanup task,因此它只需清理被杀死Task Attempt已写入HDFS的临时 数据,之后其运行状态变为SUCCEEDED,并由tasktracker通过下一次心跳告诉jobtracker
6、jobtracker收到运行状态为SUCCEEDED的task attempt后,首先检查它是否位于任务列表taskstoKill中,如果是,这表明它已经被杀死,于是将其状态转化为KILLED,同时修改相应各个数据结构

4、杀死作业
杀死作业的通过jobtracker向tasktracker发送KillTaskAction和KillJobAction命令完成的,,任何一个作业成功运行完成后,jobtracker会向各个Tasktracker广播KillJobAction以清理各个节点上该作业的工作目录。此外还可以hadoop job -kill 杀死一个作业。
这里写图片描述

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命令后,进行与第四步类似的操作
6、jobtracker收到tasktracker汇报的心跳后,若心跳信息包含任务状态变为KILLED_UNCLEAN,由于任务所属作业已被杀死(jobKilled=true),则将任务由KILLED_UNCLEAN状态转化成KILLED状态。若心跳信息包含job-cleanup task运行成功,则向各个tasktracker广播KillJobAction命令,以清理作业的工作目录和相关的内存结构

5、重新初始化
如果tasktracker上某个磁盘出现故障或者tasktracker收到来自jobtracker的ReinitTrackerAction命令,则tasktracker会重新进行初始化,重新初始化和tasktracker启动过程一样的

0 0
原创粉丝点击