1

在 Hadoop MapReduce 中,在所有映射器完成之前不会启动减速器。有人可以解释一下这个逻辑是在哪个部分/类/代码行实现的吗?我说的是 Hadoop MapReduce 版本 1(不是 Yarn)。我已经搜索了 map reduce 框架,但是有很多类,我不太了解方法调用及其顺序。

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

4

2 回答 2

3

这是在洗牌阶段完成的。对于 Hadoop 1.x,请查看org.apache.hadoop.mapred.ReduceTask.ReduceCopier,它实现了ShuffleConsumerPlugin. 您可能还想阅读 Verma 等人的“打破 MapReduce 阶段障碍”研究论文。

编辑:

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

于 2013-08-15T20:36:49.350 回答
2

需要澄清的几点:

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

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

这一切都由JobInProgress类中的作业跟踪器控制,第 775、1610、1664 行。

于 2013-08-15T20:41:58.503 回答