Hadoop:Reducer被调用两次

时间:2014-08-21 19:00:31

标签: java hadoop

我在EMR上使用Hadoop。我写了一个简单的程序,它运行一个map-reduce进程。我得到的输出不是我所期望的,并且通过调试打印我发现减速器实际上被调用了两次:一次用mapper的输出作为输入,第二次用第一次reducer的输出作为输入。 /> 最后,减速器第二次运行的输出是我得到的输出 我在AMI 3.1.1上使用Hadoop 2.4.0,而reduce方法签名是:

@Override  
public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException 

有谁知道为什么会这样?

2 个答案:

答案 0 :(得分:5)

Hadoop默认使用speculative execution,并且无法保证您的mapper或reducer只运行一次。这就是为什么你应该禁用具有副作用的reduce任务的推测执行。很有可能看到多个日志语句和类似的东西。

这里的答案是使用jobtracker来验证map和reduce任务是否已成功完成,并以您期望的方式运行。由于推测性执行,查看日志语句不是确定这一点的可靠方法。

另一种可能性是你的作业定义为减速器确实被调用两次,可能是错误的。你需要发布你的工作配置和更多的细节,以便我们能够解决这个问题。

答案 1 :(得分:3)

感谢您的回答,
问题非常简单:我从以前的工作配置中复制了作业配置,其中组合器和减速器是同一类。 所以我把combiner类写成了reducer,它使reducer运行了两次。取消组合器类已经解决了这个问题。

再次感谢!