天天看点

MapReduce的容错机制

前言:

MapReduce计算框架提供了很好的容错机制,本篇文章就是来介绍该框架是如何来容错的,我们可以从错误出现的情况来探讨该框架是如何容错的,常见的错误有作业错误、网络错误甚至数据错误。

  1. 任务出错
任务出错是比较常见的,引起错误的原因通常有低质量的代码、数据损坏、节点暂时性故障、一个任务出现下列三种情况的任意一种时被认为出错。 (1)抛出一个没有铺货的异常 (2)以一个非零值退出程序 (3)在一定的事件内没有向Tasktracker报告进度。 当TaskTracker检测到一个错误,TaskTracker将在下一次心跳里向JobTracker报告该错误,JobTracker收到报告的错误后,将会判断是否需要进行重试,如果是,则重新调度该任务。默认的尝试次数为4次,可以通过mapred-site.xml的配置项mapreduce.map.maxattempts配置。该任务可能在集群的任意一个节点重试,这取决于集群资源的利用情况。如果同一个作业的多个任务在同一个TaskTracker节点反复失败,那么JobTracker会将该TaskTracker放到作业级别的黑名单,从而避免将该作业的其他任务分配到该TaskTracker上。如果多个作业的多个任务在同一个TaskTracker节点反复失败,那么JobTracker会将该TaskTracker放到一个全局的黑名单24小时,从而避免所有作业的任务呗分配到TaskTracker上。 当一个任务经过最大尝试数的尝试运行后仍然失败,那么整个作业将被标记为失败。如果我们不希望这样(因为可能作业的溢写结果还是可用的),那么可以设置允许在不处罚整个作业失败的任务失败的最大百分比。 2、TaskTracker出错 当TaskTracker进程崩溃或者TaskTracker进程所在节点故障时,JobTracker将接收不到TaskTracker发来的心跳,那么JobTracker将会认为该TaskTracker失效并且在该TaskTracker运行过的任务都会被认为失败,这些将会被重新调度到别的TaskTracker执行,而对于用户来说,在执行MapReduce任务时,只会感觉到该作业在执行的一段时间里变慢了。 3、JobTracker出错 在Hadoop中,JobTracker出错是非常严重的额情况,因为在Hadoop中JobTracker存在单节点故障的可能性,所以如果如果JobTracker一旦出错,那么正在运行的所有作业的内部状态信息将会丢失,即使JobTracker马上恢复了,作业的所有任务都会被认为是失败的,即所有作业都需要重新执行。 4、HDFS出错 对于依赖底层存储HDFS的作业,一旦HDFS出错,那么对于整个作业来说,还是会执行失败,当DataNode出错时,MapReduce会从其他DataNode上读取所需数据,除非包含任务所需的数据块的节点都出错,否则都是可以恢复的。如果NameNode出错,任务将在下一次访问NameNode时报错,但是MapReduce计算框架还是会尝试执行4次(默认的最大尝试执行次数为4),在这期间,如果NameNode依然处于故障状态,那么作业会最终执行失败。

继续阅读