hadoop之failed task和killed task

failed task可理解为自杀,也就是task本身出了问题而自杀;killed task可理解为是他杀,也就是jobtracker认为这个任务的执行是多余的,所以把任务直接杀掉。起初用hadoop的时候经常在一个complete的job中看到几个failed 或者是 killed task,还经常好奇为什么有的时候task的失败不会影响到整个job的失败,而有的时候就会使整个job的失败,到底failed和killed task对整个job的影响是什么?

failed task
failed task出现的原因可分为以下几种情况:
1 child task失败,比如map/reduce任务中抛出了异常,child JVM会将这个error汇报给tasktracker,tasktracker再回将这个error汇报给jobtracker
2 child JVM失败,比如启动child task的JVM本身出现了bug,导致进程直接死掉,此时tasktracker会知道child JVM已经退出,并汇报给jobtracker此次task attempt失败
3 任务超时,如果某个任务很长时间都没有更新状态,则认为任务超时。有的任务虽然执行时间非常长,但它不停的在更新自己的状态,所以系统也不会认为这是个超时任务
4 tasktracker由于软件或硬件的原因直接挂掉了。对于这种情况,tasktracker会停止向jobtracker发送心跳,jobtracker会认为这是个dead node并把该节点加入黑名单,从此不再给这个节点分配任务,直到问题被修复后tasktracker重新汇报心跳。我遇到最囧的情况就是当各节点hosts不一致的时候,会出现tasktracker向jobtasker发送心跳,但jobtracker不能正确向tasktracker,形成了半死不活的节点~。
hadoop本身的一个设计理念就是在普通的pc硬件上构建高可靠性的系统,任何failed task都不会引起整个job的失败,因为所有失败的任务都会被重新执行(reschedule execution),只有当重新执行的次数超过4次,才会把这任务标记为失败,导致整个job的失败。

killed task
在介绍killed task之前,先介绍一下speculative execution。举个简单的例子,如果某个job有2000个map task,已经完成了1999个,只剩下一个task由于硬件比较慢而成为拖尾任务,为了减少拖尾任务对整个job运行时间的影响,jobtracker会重新启动一个一模一样的duplicate task和原有的task并行的执行,这样有一个task执行成功,整个map过程就会结束。speculative execution只有个处理拖尾任务的优化策略,并不能提高系统的可靠性。
介绍完speculative execution后我们来看看killed task的情况。killed task可能在两种情况下发生,一个是speculative execution中两个并行duplicate task中如果有一个执行成功,另一个将被kill掉;第二种情况是如果某个tasktracker挂了,那么正在该节点上面跑的任务都将被标记为killed。

===================================================================================================================================

首先说说Task容错机制
Task的运行情况由对应的一个TaskInProgress对象来跟踪,它允许一个Task尝试运行多次,每次成为一个Task Attempt
Hadoop提供了两个可配置的参数:
     mapred.map.max.attempts 
     mapred.reduce.max.attempts
hadoop提交作业时可通过设置这两个参数来设置Map Task和Reduce Task尝试运行最大次数。
默认情况下,这两个值均为4。
如果尝试4次之后仍旧为运行成功,则TaskInProgress对象将该任务运行状态标注成FAILED。
未成功运行的Task Attempt分为两种,killed task 和failed task,他们分别对应的状态为KILLED,FAILED其中killed task 是MapReduce框架主动杀死的Task Attempt,一般产生于一下3中场景。

1.认为杀死Task Attempt:用户使用命令bin/hadoop job -kill-task task_id将一个Task Attempt杀死
2.磁盘空间或者内存不够:任务运行过程中,出现磁盘或者内存磁盘不足的情况,MapReduce框架需要采用一定策略杀次若干个Task已释放资源,其选择杀死Task的策略是优先选择Reduce Task,其实是进度最慢的Map Task。
3.TaskTracker丢失:如果TaskTracker在一定时间内未想JobTracker回报心跳,则JobTracker认为该TaskTracker已经死掉,它上面的任务将被杀掉。

Failed Task是自身运行失败的Task Attempt,通常产生一下几种场景:
1.人为使Task Attempt失败:用户使用命令bin/hadoop job -fail-task task_id 是一个Task Attempt杀死。
2.本地文件读写错误:Task 运行过程中,由于磁盘坏道等原因,导致文件读写错误。
3.Shuffle阶段错误:Reduce Task从Map Task端远程读取数据过程中出错。
4.Counter数目过多:用户自定义的Counter或者Counter Group数据木超过系统要求的上线。
5.一定时间内未汇报进度:由于程序Bug或者数据格式问题,任务在一定时间间隔内未汇报进度。
6.使用内存量超过期望值:用户提交作业时可指定每个Task预期使用的内存量,如果在运行过程中超过该值,则会运行失败。
7.任务运行过程中的其他错误:如初始化错误,其他可能的致命错误。

Failed Task 和killed Task除了产生场景不同以外,还有以下两个重要区别:
调度策略:一个Task Attempt在某个节点运行失败之后,调度器变不会将同一个Task的Task Attempt分配给该节点。而Task Attempt 被杀死后,仍可能被调度到同一个节点上运行。
尝试次数:Task容错机制是针对faile task的。也就是说,任何一个Task允许的失败次数是有限的。而对于killed task,由于他们是被框架主动杀死的,他们自身并不存在问题,因此会不断尝试运行,直到运行成功。
————————————————
版权声明:本文为CSDN博主「快乐程序员」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bigdatahappy/article/details/12504833

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值