使用旧的Hadoop API覆盖映射器中的清理方法时出错

时间:2013-12-28 00:06:30

标签: hadoop mapreduce

我有一个map任务,我在其中覆盖cleanup函数,如下所示,但IDE显示错误消息“GraphAnonymization.Map_Phase3类型的方法清理(Mapper.Context)必须覆盖或实现超类型方法“

public static class Map_Phase3 extends MapReduceBase implements Mapper<LongWritable, Text, Text, Text> { 
 @Override
 public void cleanup(Context context) throws IOException, InterruptedException{
     context.write()        
     ...
 }
}

旧的Hadoop API中未定义方法cleanup。我是否必须切换到新的API?

1 个答案:

答案 0 :(得分:0)

在旧的API(mapred)中,Mapper接口扩展了Closable接口 - 它定义了close方法(而不是cleanup,它是新mapreduce API映射器的方法)。

因此,请将您的代码修改为以下内容:

public static class Map_Phase3 extends MapReduceBase implements Mapper<LongWritable, Text, Text, Text> { 
    @Override
    public void close() {

    }
}

旧的API不会传递OutputCollector,您可以写出任何最终值或累积值,因此您需要在映射器的实例变量中缓存传递给map方法的值。最后,您需要在RuntimeException中包装任何异常,因为close方法没有定义任何抛出的异常