mapreduce中我们自己定义的mapper和reducer程序在运行后有可能遇上出错退出的情况,mapreduce中jobtracker会全程追踪任务的运行情况,对于出错的任务mapreduce也定义了一套自己的处理方式。
首先要明白的是mapreduce推断任务失败的方式。三种情况下任务会被觉得运行失败:返回非0值、产生java异常、超时(长时间没响应)。对于第一种,通经常使用于streaming程序。假设你的mapper或reducer程序结束的时候返回了非0值,那么mapreduce会觉得你的任务失败了。另外一种主要用于java写的mapreduce程序。对于第三种,预计非常多人都不知道。对于streaming,mapreduce在任务运行后会监測任务的输出(标准输出),假设任务在一定时间内无输出(这个时间能够通过mapred.task.timeout选项设定),则mapreduce会觉得这个任务失败。因此写mapreduce程序的时候一定要留意程序是否会发生超时间假死的情况,假设有这样的情况那就要考虑下程序会不会被误杀。
在任务失败后,mapreduce会又一次运行任务,重试的次数也是能够设定的,通常是4次。
最后还要注意的是mapreduce另一个猜測式运行机制,在这个机制下假设任务运行时间超出预期(这个预期是依据其它任务的运行时间定的),那么mapreduce会另外启动一个跟这个任务同样的任务并行运行,在某个任务最先运行完毕之后杀死其它尚未完毕的任务。这个机制主要是用来避免某个reduce任务的运行环境有问题或者某个reduce任务运行中发生了反常情况而迟迟不能完毕拖慢总体进度。可是这个机制在有些情况下也会造成问题,比如:假设你的reduce程序在同样输入并发运行的情况下会造成冲突,那么猜測式运行机制对你来说就是个极大的隐患。只是好在猜測式运行机制也是能够关闭的。