在开始描述Jobtracker,Tasktracker,Task失败之前,先回顾下Jobtracker,Tasktracker以及Task的功能。

一:概述

  hadoop采用的是Master/Slaves结构。Master的作用就是对整个集群进行状态监控,任务调度,作业管理。Jobtracker就是MapReduce中的Master。同理,Slaves负责执行任务和执行任务状态的返回,也就是TaskTracker

Jobtracker:

 1:通过heartbeat机制来监控作业状态,作业的进度,以及作业的健康程度。

 2:负责把一个作业分解成多个任务。

 3:资源的管理。

4:下达命令,由Tasktracker来执行。

Tasktracker:

 1:Tasktracker就是Jobtracker和Task直接的桥梁(也可以理解为一个节点的mapreduce的管理者)。

2:Jobtracker负责收集该几点机器的信息比如:机器的健康信息,机器的资源使用情况。也包括任务的信息比如:任务的

进度和任务的健康情况。最后通过hearbeat机制发送给Jobtracker。

启动任务(LaunchTaskAction)、提交任务(CommitTaskAction)、杀死任务

(KillTaskAction)、杀死作业(KillJobAction)和重新初始化(TaskTrackerReinitAction)。

二:Task失败分析

1:Task失败原因和参数修改

Task任务失败的原因有两个:

1)Map端或者Reduce端导致的JVM异常退出从而导致Tasktracker把Task attempt标记为fail。

2)任务的挂起导致Tasktracker标记任务为fail。

JVM异常退出导致的任务失败:

Task分为MapTask和ReduceTask。大多数Task失败都是Map或者Reduce端发生异常而导致的。如果这种情况发生,JVM会在退出

之前向Tasktracker发送错误信息。错误信息记录在用户的日志中,并且Tasktracker会把这次任务尝试(task attemp)标记为fail。最

后释放槽以便能够执行其他任务。

还有中异常是JVM突然发生错误,比如JVM内部的错误,或者用户MapReduce代码原因。这种情况Tasktrack会注意到进程

已经退出,依然会把这次任务尝试(task attemp)标记fail。

任务挂起导致的任务失败:

当Tasktrack经过一段时间没有收到任务的进度更新,则会把这个任务标记为fail。在此之后,会把这个JVM子进程给kill掉,

任务的超时时间间隔通常为10分钟。此设置可以修改:把maped.task.timeout属性设置为自己想要的时间即可,单位好毫秒。

需要注意的是如果把超时时间设置为0,那么代表挂起的进程永远不会过时,不会被kill,导致挂起的槽永远不会释放它的槽,

导致其他任务无法获取它的槽,最终导致hadoop集群的效率低下。

最大力度减少任务失败的影响:

hadoop默认情况下,当一个任务连续4次都是失败的,那么会导致整个作业的失败(这个影响其实还是挺大的,浪费半天时间和精

力最终功亏一篑)。下面给出两个方案来解决这个问题:

maped.map.max.attemps,

如果修改的参数比较小,减少hadoop无谓的开销,如果修改比较大则可能下一次任务可能成功。ps:站在hadoop集群这方看这个

问题就是:1:执行失败就滚蛋,给老子省点资源,好多人等着作业呢:2:万一下次作业成功了呢,那么前面的工作也不算白费。

mapred-site.xml内的参数为

<property>  
  <name>mapred.max.map.failures.percent</name>  
  <value>5</value>  
</property> 

重启jobtracker (hadoop-daemon.sh stop/start jobtracker) 。

参数含义:

5代表的意思为百分比,假如有100个map,100*5%=5,则代表这如果有小于等于5个map任务失败,那么该作业会继续工作。

修改reduce端参数改为mapred.max.reduce.failures.percent即可。

三:Tasktracker失败分析

如果某tasktracker崩溃或者运行过于缓慢而执行,会停止或者很少想Jobtracker发送信息。Jobtracker会注意到tasktracker

已经停止向Jobtracker发送heartbeat信息(如果10分钟没有收到heartbeat信息,这由maped.tasktracker.expiry.interval

属性来设置),会将它从等待任务调度的tasktracker池中移出。

四:Jobtracker失败分析

Jobtracker失败是所以失败中最严重的一种,一定会导致整个作业的失败。