【发布时间】:2023-03-22 14:25:01
【问题描述】:
当我尝试在我的 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)
原因是,我在 reducer 类中使用 null 作为我的输出 VALUE。 减速机代码:
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 作为输出?
【问题讨论】:
-
为什么不使用 Java 的 Optional 或空对象?或者在你的 reducer 代码中检查 null 值。
-
我不知道你为什么是
null,你有没有考虑改用NullWritable。 -
@YoungHobbit,我试过 NullWritable 但我遇到了同样的错误。只是为了测试我尝试了new IntWritable(),然后就没有问题了。但是输出不符合预期,最后追加了0。