[原创] JAVA map-reduce job中,reduce()方法漏写 @Override 注解引起的问题

有一个JAVA写的map-reduce job,mapper输出的key、value类型分别为Text、NullWritable,所以reducer应该像下面这样写:

static class QuerySegmentResultFromKVReducer extends Reducer<TextNullWritableNullWritableNullWritable{

  @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就会提示错误,编译就会失败!

@Override 注解是可选的,如果删除了它,编译器不会报错,因为在 JAVA 中,重写一个方法时不使用 @Override 注解也是允许的。
 
但是,建议在重写父类或接口中的方法时使用 @Override 注解。这样做有以下几个好处:
➤ 增加代码可读性:通过使用 @Override 注解,其他开发人员可以清楚地知道该方法是对父类或接口中的方法进行重写的,代码更易于理解。
➤ 防止错误:如果你错误地拼写了要重写的方法名,或者方法签名不正确,编译器会给出错误提示,帮助你发现潜在的问题。
➤ 保证代码的健壮性:如果父类或接口中的方法发生了变化,使用 @Override 注解的方法会在编译时产生错误,提醒你需要更新重写的方法。

在本文的例子中,如果reduce()方法没有写 @Override 注解,那么当reducer类错误地定义成了extends Reducer<Text, Text, NullWritable, NullWritable>的时候,IDE并不会发现reduce()方法有错,从而让你误以为一切正常。
文章来源:https://www.codelast.com/
➤➤ 版权声明 ➤➤ 
转载需注明出处:codelast.com 
感谢关注我的微信公众号(微信扫一扫):
wechat qrcode of codelast
以及我的微信视频号:

发表评论