我在和hadoop合作emr。我写了一个简单的程序,运行一个map reduce进程。我得到的输出并不是我所期望的,通过debug prints,我发现reducer实际上被调用了两次:一次是以Map器的输出作为输入,第二次是以第一个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条答案
按热度按时间q5lcpyga1#
谢谢你的回答,
问题很简单:我从以前的工作配置中复制了作业配置,其中合并器和缩减器是同一个类。
所以我编写了combiner类作为reducer,它使reducer运行了两次。取消combiner类解决了这个问题。
再次感谢!
f0brbegy2#
hadoop在默认情况下使用推测执行,并且不能保证Map器或reducer只运行一次。这就是为什么您应该禁用具有副作用的reduce任务的推测性执行。很可能会看到多个日志语句之类的内容。
这里的答案是使用jobtracker来验证map和reduce任务是否成功完成,并且是否按预期的方式运行。由于推测性执行,查看日志语句并不是确定这一点的可靠方法。
另一种可能性是,您的作业的定义方式是,减速机确实被调用了两次,可能是错误的。你需要张贴你的工作配置和更多的细节,以便我们能够解决,如果这是事实上的情况。