当我尝试在我的mr工作中使用combiner时,我得到了以下例外
java.lang.nullpointerexception异常
在org.apache.hadoop.mapred.ifile$writer.append(ifile。java:193)
在org.apache.hadoop.mapred.task$combineoutputcollector.collect(task。java:1315)
在org.apache.hadoop.mapred.task$newcombinerrunner$outputconverter.write(task。java:1632)
原因是,我在reducer类中使用null作为输出值。减速机代码:
public static class reducer extends Reducer<Text,IntWritable,Text,IntWritable>{
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException{
context.write(key, null);
}
}
当我移除combiner类job.setcombinerclass(reducer.class)时;工作越来越成功了。
我如何实现合路器,我需要相同的减速机输出ie只有关键的输出?
1条答案
按热度按时间xqk2d5yq1#
这是不可能实现的。问题在于ifile.java中的以下代码:
在
append()
功能,有一个检查:既然你路过
null
作为值NullPointerException
当它试图getClass()
在null
价值:所以,即使你用
NullWritable
(又是一门课)然后通过null
,您仍将获得NullPointerException
.而不是传球
null
,您应该通过传递0(零)来管理。