JobTracker容错
三种级别的恢复机制:
级别由低到高
- 作业级别
- 任务级别
- 记录级别
级别越低,实现越简单,但造成的资源浪费越严重。
1.0版本以前,hadoop采用任务级别的恢复机制,基于事务型日志完成作业恢复的。它只关注两种任务:运行完成的和未运行完成的。
作业运行过程中,JobTracker会以日志形式将作业以及任务状态记录下来,一旦重启,则可从日志中恢复作业的运行状态,未开始运行的要重新运行,实现比较复杂。
0.21.0版本开始,hadoop采用作业级别的恢复机制,当JobTracker重启,未运行完成的作业会重新运行
TaskTracker容错
三种:超时机制、灰名单与黑名单机制、Exclude list与Include list
超时机制
字面意思,超时没有响应,就认为出了故障。
具体如下:
- TaskTracker第一次汇报心跳后,JobTracker会将其放入过期队列trackerExpiryQueue中,并将其加入网络拓扑结构中。
- TaskTracker每次汇报心跳,JobTracker都会记录最近心跳时间(TaskTrackerStatus.lastSeen)
- 线程expireTrackersThread周期性地扫描过期队列trackerExpiryQueue,如果发现某个TaskTracker在10分钟内没有汇报心跳,则将其从集群中移除。(移除之前,JobTracker会将该TaskTracker上所有满足以下条件的任务杀死,并将它们重新加入任务等待队列中,以便被调度到其他健康节点上重新运行:①任务所属作业处于运行或者等待状态②未运行完成的Task或者Reduce Task数目不为零的作业中已运行完成的Map Task。
灰名单和黑名单机制
这两个名单里的Task Tracker不可再接收作业,被宣判死亡。
(1)灰名单
作业运行过程中,会动态生成黑名单,黑名单里的TaskTracker没有任何机会运行该作业的任何任务,黑名单的生成机制:作业运行过程会记录每个Task Tracker使其失败的Task Attempt数目,一旦该数目超过mapred.max.tracker.failures(默认4),对应的TaskTracker就会被加入黑名单。
JobTracker会记录每个TaskTracker被加入黑名单的次数#blacklist,如果满足下面条件,就会被加入灰名单:
- #blacklsit超过mapred.max.tracker.failures(默认4)
- 该TaskTracker的#blacklists大小超过所有TaskTracker的#blacklist平均值的mapred.cluster.average.blacklist.threshold(默认50%)倍。
- 当前灰名单中TaskTracker的数目小于所有TaskTracker数目的50%。
JobTracker为每个#blacklist大于0的TaskTracker维护了一个环形桶的数据结构,该数据结构保存了最近一段时间内TaskTracker对应的#blacklist值,由于该值随着时间推移不断变化,因此TaskTracker会不断进出灰名单。
(2)黑名单
Exclude list与Include list
Exclude list表示非法节点列表,位于该列表中的节点无法与JobTracker连接;
Include list是合法节点列表,只有位于该列表中的节点才允许向JobTracker发起连接请求。
默认情况下,这两个列表为空,表示任何节点都可以接入JobTracker,可在mapred-size.xml中配置,也可以动态加载生效。
tip:黑名单和非法节点列表不同,黑名单是Task Tracker,非法节点是host;如果Task Tracker被加入黑名单,则它上面运行的任务可以正常运行结果,只是不能接收新任务,但是非法节点中的节点上面所有正在运行的任务将无法成功运行完成。
Job/Task容错
Job容错机制
Job分为多个Task,在很多应用场景下 ,由于数据量巨大,丢弃一小部分数据不会影响最终结果,所以为了支持容错,MapReduce允许丢弃部分输入数据而保证绝大部分数据有效,所以,MapReduce允许部分Task失败,其对应的处理结果不再计入最终的结果。
Hadoop为作业提供了两个可配置参数:mapred.max.map.failures.percent和mapred.max.reduce.failures.percent。用户提交作业时可通过这两个参数设定允许失败的Map任务和Reduce任务数占总任务数的百分比。默认情况下,这两个参数值均为0,即只要有一个Map任务或者Reduce任务失败,整个作业便运行失败。
Task容错机制
Hadoop提供了俩参数:mapred.map.max.attempts和mapred.reduce.max.attempts,用户提交作业时可通过这两个参数设定Map Task和Reduce Task尝试运行最大次数。默认情况下,两个参数均为4,每个Task最多可运行4次,4次后为成功,TaskInProgress会将该任务标注为FAILED。
Record容错
数据处理过程可能存在坏记录。
常见原因:
- 某些记录的key或者value超大,导致OOM
- 程序使用了第三方库,程序中存在bug,导致任务运行失败。
对于第一种情况:MapReduce允许用户在InputFormat中设置key和value的最大长度,一旦超过,就截断。
对于第二种情况:MapReduce采用了一种智能的有记忆尝试运行机制:对于一个task,MapReduce会尝试运行几次,如果总是失败,就进入skip mode模式,该模式下,Task Attempt会将要处理的数据区间发送给TaskTracker,再由TaskTracker心跳发送给JobTracker,这样JobTracker就保存了尚未处理完成的数据所在区间,如果因某条记录导致任务运行失败,JobTracker就能推断出坏记录所在的数据区间,这样,重新运行失败任务时,JobTracker能告诉新的Task Attempt,从而可在运行过程中自动跳过这些坏记录区间。
磁盘容错
TaskTracker采用的机制
TaskTracker允许用户设定以下两个参数保证节点上有足够的可用空间,防止因磁盘空间不足导致失败
- mapred.local.dir.minspacestart:TaskTracker需要保证的最小可用磁盘空间,只有当可用磁盘空间超过该值时,才会接收新任务。
- mapred.local.dir.minspacekill:TaskTracker会周期性检查所在节点的剩余磁盘空间,一旦低于该值,就按照一定策略杀掉正在运行的任务以释放磁盘空间。
JobTracker采用的机制
JobTracker保存了所有任务的运行时信息,它可以通过已经完成的任务产生的数据量估算出其他同作业任务需要的磁盘空间,这可以防止因为某个节点磁盘空间不足以容纳某个任务运行结果而导致任务运行失败。