mapreduce的哪个部分/类是停止执行减少任务的逻辑

时间:2013-08-15 20:00:46

标签: hadoop mapreduce

在Hadoop MapReduce中,没有reducer在所有映射器完成之前启动。有人可以解释一下这个逻辑实现的部分/类/代码行吗?我在谈论Hadoop MapReduce版本1(NOT Yarn)。我已经在地图上搜索了reduce框架,但是有很多类,我对方法调用和它们的排序都不太了解。

换句话说,我需要(首先用于测试目的)让减速器开始减少,即使仍有工作映射器。我知道这种方式我得到了错误的结果,但是知道这是改变框架部分的一些工作的开始。那么我应该从哪里开始寻找并做出改变呢?

2 个答案:

答案 0 :(得分:3)

这是在洗牌阶段完成的。对于Hadoop 1.x,请查看实现org.apache.hadoop.mapred.ReduceTask.ReduceCopier的{​​{1}}。您可能还想阅读Verma等人的"Breaking the MapReduce Stage Barrier"研究论文

修改

在阅读@ chris-white的回答后,我意识到我的回答需要额外的解释。在MapReduce模型中,您需要等待所有映射器完成,因为密钥需要进行分组和排序;另外,您可能会运行一些推测性映射器,但您还不知道哪个重复的映射器将首先完成。但是,正如“打破MapReduce Stage Barrier”一文所指出的那样,对于某些应用程序来说,不等待映射器的所有输出都是有意义的。如果你想要实现这种行为(最有可能用于研究目的),那么你应该看看我上面提到的类。

答案 1 :(得分:2)

澄清的一些要点:

在所有映射器完成之前,reducer无法开始缩减,它们的分区被复制到运行reducer任务的节点,最后排序。

您可能会看到减速器抢占地图输出的副本,而其他地图任务仍在运行。这是通过称为slowstart(mapred.reduce.slowstart.completed.map)的配置属性来控制的。此值表示在reducer任务启动之前需要完成的地图任务数量的比率(0.0 - 1.0)(从已完成的地图任务复制地图输出)。默认值通常约为0.9,这意味着如果您的作业有100个地图任务,其中90个需要在作业跟踪器开始启动reduce任务之前完成。

这全部由作业跟踪器控制,位于JobInProgress类,第775行,第1610行,第1664行。