如果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没成功,可能还是不能正常工作的,以前是记录错误的。)
更多Hadoop相关信息见Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13