当化简器的输出值为零时如何使用合路器



>当我尝试在我的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(零(进行管理。

相关内容

  • 没有找到相关文章

最新更新