Hadoop skip mode 代码要点

如果Hadoop数据集中有不合规格的数据,或者某些数据会引起程序崩溃,可以设置跳过模式,程序代码可以不处理这些异常,把异常抛出去让程序崩溃,hadoop框架会重新执行程序,并跳过会记录,参看http://hadoop.apache.org/common/docs/current/mapred_tutorial.html#Skipping+Bad+Records 。 但是这里没有给出代码例子,我尝试过几次都不能正常工作。经过一番排查,终于确定了可以正常工作的代码模式。

下面是可以工作的代码片断:

public class PwdSorter extends Configured implements Tool {

......

public int run(String[] args) throws Exception {

SkipBadRecords.setMapperMaxSkipRecords(getConf(), 5);

JobConf jobConf = new JobConf(getConf(), getClass());

......

}

public static void main(String[] args)throws Exception {

int res = ToolRunner.run(new PwdSorter(), args);

System.exit(res);

}

}

要点是 SkipBadRecords.setMapperMaxSkipRecords 要在 new JobConf 之前。如果这两个语句的顺序颠倒的话,skip mode不能正常工作。,缺省错误数据记录在 output/_logs/skip 目录,存储的格式是sequence file。

另外,如果用新的API,即 org.hadoop.mapreduce 包,这个包中没有 SkipBadRecords 类,用 mapred.SkipBadRecords 也能跳过怀记录。(修正:后来又试了一下,新的API Skip mode没成功,可能还是不能正常工作的,以前是记录错误的。)

相关推荐