mapreduce的哪一部分/类是停止执行reduce任务的逻辑



在Hadoop MapReduce中,在所有映射程序完成之前,没有任何reducer启动。有人能解释一下这个逻辑是在哪个部分/类/代码行实现的吗?我说的是HadoopMapReduce版本1(非Yarn)。我已经搜索了map reduce框架,但有太多的类,我不太了解方法调用及其排序。

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

这是在洗牌阶段完成的。对于Hadoop1.x,请看一下实现ShuffleConsumerPluginorg.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行。

相关内容

  • 没有找到相关文章

最新更新