在Hadoop MapReduce中,在所有映射程序完成之前,没有任何reducer启动。有人能解释一下这个逻辑是在哪个部分/类/代码行实现的吗?我说的是HadoopMapReduce版本1(非Yarn)。我已经搜索了map reduce框架,但有太多的类,我不太了解方法调用及其排序。
换句话说,我需要(首先出于测试目的)让减速器开始减速,即使仍然有工作的映射器。我知道这样我会得到错误的工作结果,但我知道这是改变框架部分工作的开始。那么,我应该从哪里开始寻找并做出改变呢?
这是在洗牌阶段完成的。对于Hadoop1.x,请看一下实现ShuffleConsumerPlugin
的org.apache.hadoop.mapred.ReduceTask.ReduceCopier
。你可能还想阅读Verma等人的"打破MapReduce阶段障碍"研究论文。
编辑:
在阅读了@chriswhite的答案后,我意识到我的答案需要一个额外的解释。在MapReduce模型中,您需要等待所有映射器完成,因为键需要分组和排序;另外,您可能有一些推测性的映射程序正在运行,但您还不知道哪个重复的映射程序将首先完成。然而,正如"打破MapReduce阶段障碍"论文所指出的,对于某些应用程序来说,不等待映射器的所有输出可能是有意义的。如果你想实现这种行为(很可能是为了研究目的),那么你应该看看我上面提到的类。
需要澄清的几点:
在完成所有映射程序、将其分区复制到运行reducer任务的节点并最终排序之前,reducer无法开始缩减。
您可能会看到一个reducer在其他映射任务仍在运行时抢占映射输出的副本。这是通过称为慢启动(mapred.reduce.slowstart.completed.map
)的配置属性来控制的。该值表示在reducer任务启动之前需要完成的映射任务数的比率(0.0-1.0)(复制已完成的映射输出)。默认值通常在0.9左右,这意味着如果你的工作有100个地图任务,那么在工作跟踪器开始启动reduce任务之前,需要完成其中的90个任务。
这一切都是由JobInProgress类中的作业跟踪器控制的,第775、1610、1664行。