在 Hadoop MapReduce 中,在所有映射器完成之前不会启动减速器。有人可以解释一下这个逻辑是在哪个部分/类/代码行实现的吗?我说的是 Hadoop MapReduce 版本 1(不是 Yarn)。我已经搜索了 map reduce 框架,但是有很多类,我不太了解方法调用及其顺序。
换句话说,我需要(首先出于测试目的)让减速器开始减少,即使仍然有工作的映射器。我知道这样我会得到错误的工作结果,但要知道这是改变框架部分工作的开始。那么我应该从哪里开始寻找并做出改变呢?
这是在洗牌阶段完成的。对于 Hadoop 1.x,请查看org.apache.hadoop.mapred.ReduceTask.ReduceCopier
,它实现了ShuffleConsumerPlugin
. 您可能还想阅读 Verma 等人的“打破 MapReduce 阶段障碍”研究论文。
编辑:
阅读@chris-white 的答案后,我意识到我的答案需要额外的解释。在 MapReduce 模型中,您需要等待所有映射器完成,因为键需要分组和排序;另外,您可能正在运行一些推测映射器,但您还不知道哪个重复映射器将首先完成。然而,正如“打破 MapReduce 阶段障碍”论文所指出的,对于某些应用程序,不等待映射器的所有输出可能是有意义的。如果你想实现这种行为(很可能是出于研究目的),那么你应该看看我上面提到的类。
需要澄清的几点:
在所有映射器都完成之前,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 行。