>当我尝试在我的MR作业中使用组合器时,我得到以下异常
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(
原因是,我在化简器类中使用 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);
}
}
当我删除组合器类 job.setCombinerClass(reducer.class(; 作业正在成功。
如何实现合路器,我需要相同的减速器输出,即只有 KEY 作为输出?
这是不可能的。问题是 IFile.java 中的以下代码段:
public void append(K key, V value) throws IOException {
.....
if (value.getClass() != valueClass)
throw new IOException("wrong value class: "+ value.getClass()
+" is not "+ valueClass);
.....
在append()
函数中,有一个检查:
if (value.getClass() != valueClass)
由于您传递null
作为值,因此当它尝试getClass()
null
值时,将抛出NullPointerException
:
value.getClass()
因此,即使您使用NullWritable
(又是一个类(并通过null
,您仍然会得到NullPointerException
。
与其传递null
,不如通过传递 0(零(进行管理。