HADOOP中的容错机制

1.       JobTracker容错
在MapReduce中,JobTracker掌握了整个集群的运行信息,包括节点健康状况,资源分布情况以及所有作业的运行时信息。如果JobTracker因故障而重启,像节点情况以及资源情况可以利用心跳来构造,但是对于作业运行状态可能会丢失,意味着之前已经运行完成的任务会重新运行。因此,这里的关键是保存和恢复作业运行的信息。现有的技术分为3个级别的恢复机制。对于作业级别,他利用日志的方式记录完成的作业。对于任务级别,他利用日志方式记录完成的任务,当故障重启后,可以从日志中恢复作业的运行状态,即完成的任务无需运行。还有一种是从失败作业的第一条未处理的记录来恢复任务(设置断点,保存状态)。
2.       TaskTracker容错
(1)       超时机制
TaskTracker汇报心跳后,JobTracker会将他放到过期队列:trackerExpiryQueue中,并将其加入网络拓扑结构中。同时,TaskTracker每次汇报心跳,JobTracker会记录他的最近的心跳时间(TaskTrackerStatus.lastSeen)。同时,线程expireTrackerThread周期性的扫描队列trackerExpiryQueue,如果发现在某段时间(mapred.tasktracker.expiry.interval设置)内未汇报心跳,则将其从集群中移除。如果发现该任务处在运行或者等待状态或者是未完成的Task或者Reduce Task数目不为零的作业中已经完成的Map Task,则将会放入其他节点重新运行。
(2)       灰名单与黑名单
如果作业在运行过程中记录每个TaskTracker使其失败的Task Attempt数目,一旦超过mapred.max.tracker.failures,对应的TaskTracker会被加入该作业的黑名单中。
    JobTracker将记录每个TaskTracker被作业加入黑名单的次数#backlist。当某个TaskTracker同时满足一定条件(#backlist大小超过一定值(mapred.max.tracker.backlists);该TaskTracker的#blacklist大小占所有的百分比超过一定值(mapred.cluster.average.blacklist.thredshold);灰名单中的个数小于所有TaskTracker数目的50%),会被加入JobTracker的灰名单中。
    可以为每个TaskTracker维护一个环形桶数据结构。



         该环形桶维护一段时间内的#blacklist值,同时为了节省内存,以及便于计算,只划分若干个等时间片。用一个数组numFaults[]来维护所有桶(时间片)的#blacklist值。同时,指针lastRotated指向最近更新的桶的位置(即桶的头部)。代码如下:
//checkRotation为将lastRotated到某个新时间点timeStamp之间的时间片清零,同时将lastRotated放到最新的时间片上
void checkRotated(long timeStamp){
    long diff=timeStamp-lastRotated;
    while(diff>bucketWidth){
            lastRotated+=bucketWidth;
            int idx=(int)((lastRotated/bucketWidth)%numPaultBuckets);
            numFaults[idx]=0;
            diff-=bucketWidth;
    }
}
 
//将某个时间点对应的桶计数器+1,代码如下:
void incrFaultCount(long timeStamp){
    checkRotation(timeStamp);
    ++numFaults[bucketIndex(timeStamp)];
}
//返回时间对应的时间片
int bucketIndex(long timeStamp){
    return (int)(timeStamp/bucketWidth)%numFaultBuckets);
}
 
他的过程就是在incrFaultCount输入一个Tasktricker被作业加入黑名单的时间,然后在checkRotation函数中将之前最新的时间与现在时间之间的时间片清0。如果有的时间片内有内容,意味着他过期了。之后对现在新的时间所对应的时间片加1。表示此时有事件发生。
3.       Job/Task容错
一个作业会被分解成多个任务,当所有任务运行完成时,才算运行成功。然而在有些场景中,由于数据量很大,允许丢弃一小部分数据但不影响结果。所有HADOOP中设置两个参数mapred.max.map.failures.percent和mapred.max.reduce.failures.percent来控制允许失败的MAP任务与REDUCE任务的比例。
对于一个Task,他允许尝试运行多次,即Task Attempt。只要一个运行成功,则标记成功。同时当尝试次数超过阈值(mapred.map.max.attempts,mapred.reduce.max.attempts),则认为运行失败。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值