当reducer的输出值为空时,如何使用combiner?

rur96b6h  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(358)

当我尝试在我的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只有关键的输出?

xqk2d5yq

xqk2d5yq1#

这是不可能实现的。问题在于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 作为值 NullPointerException 当它试图 getClass()null 价值:

value.getClass()

所以,即使你用 NullWritable (又是一门课)然后通过 null ,您仍将获得 NullPointerException .
而不是传球 null ,您应该通过传递0(零)来管理。

相关问题