有一个JAVA写的map-reduce job,mapper输出的key、value类型分别为Text、NullWritable,所以reducer应该像下面这样写:
static class QuerySegmentResultFromKVReducer extends Reducer<Text, NullWritable, NullWritable, NullWritable> {
@Override
protected void setup(Reducer.Context context) throws IOException, InterruptedException {
}
@Override
protected void cleanup(Reducer.Context context) throws IOException, InterruptedException {
}
@Override
protected void reduce(Text key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException {
//TODO:
}
}
在这里,reducer输出的key、value类型都是NullWritable,我们不用关心,这不是本文的关注点。
如果reduce()方法漏掉了 @Override 注解,并且把 Reducer<Text, NullWritable, NullWritable, NullWritable> 错误地写成了 Reducer<Text, Text, NullWritable, NullWritable>,会发现编译并不报错。
但是,当你跑这个job的时候,诡异的事情就来了。你会发现,你在“TODO:”那里写的reduce逻辑并没有执行,即使没有用 context.write() 方法把任何数据输出到HDFS上,Hadoop counter仍然显示该job输出了和reducer输入一样多的数据。
从现象上看,就像是执行了一个默认的Reducer,把reducer的输入数据原样输出。
文章来源:https://www.codelast.com/
所以这里不得不强调,一定不要漏写 @Override 注解!有这个注解的时候,IDE就会提示错误,编译就会失败!
在本文的例子中,如果reduce()方法没有写 @Override 注解,那么当reducer类错误地定义成了extends Reducer<Text, Text, NullWritable, NullWritable>的时候,IDE并不会发现reduce()方法有错,从而让你误以为一切正常。
文章来源:https://www.codelast.com/
➤➤ 版权声明 ➤➤
转载需注明出处:codelast.com
感谢关注我的微信公众号(微信扫一扫):
以及我的微信视频号: