Hadoop:Reducer被调用两次

ari*_*abc 1 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 
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么会发生这种情况?

Pau*_*ald 5

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

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

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


ari*_*abc 5

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

再次感谢!