4

我从Hadoop中reduce任务何时开始了解到hadoop中的reduce任务包含三个步骤:shuffle、sort和reduce,其中排序(以及之后的reduce)只能在所有映射器完成后开始。有没有办法在每次映射器完成时开始排序和减少。

例如,让我们只有一项使用映射器 mapperA 和 mapperB 以及 2 个 reducer 的工作。我想做的是:

  1. mapperA 完成
  2. shuffles 复制 mapperAs 输出的适当分区让我们说 reducer 1 和 2
  3. sort on reducer 1 和 2 开始排序和归约并生成一些中间输出
  4. 现在mapperB完成
  5. shuffles 将 mapperBs 输出的适当分区复制到 reducer 1 和 2
  6. 在 reducer 1 和 2 上的 sort 和 reduce 再次开始,reducer 将新输出与旧输出合并

这可能吗?谢谢

4

3 回答 3

3

您不能使用当前的实现。然而,人们已经“破解”了 Hadoop 代码来做你想做的事。

在 MapReduce 模型中,您需要等待所有映射器完成,因为键需要分组和排序;另外,您可能正在运行一些推测映射器,但您还不知道哪个重复映射器将首先完成。

然而,正如“打破 MapReduce 阶段障碍”论文所指出的,对于某些应用程序,不等待映射器的所有输出可能是有意义的。如果您想实现这种行为(很可能是出于研究目的),那么您应该查看org.apache.hadoop.mapred.ReduceTask.ReduceCopier实现ShuffleConsumerPlugin.

编辑:最后,正如@teo 在这个相关的SO 问题中指出的那样,

ReduceCopier.fetchOutputs()方法是保持reduce任务运行直到所有映射输出被复制(通过Hadoop版本1.0.4的第2026行中的while循环)的方法。

于 2013-08-15T20:56:28.240 回答
2

您可以使用 slowstart 属性进行配置,该属性表示在复制到减速器开始之前需要完成的映射器的百分比。通常默认值为 0.9 - 0.95 (90-95%) 标记,但您可以根据需要覆盖为 0

`mapreduce.reduce.slowstart.completed.map`
于 2013-05-22T10:16:57.377 回答
1

在所有映射器完成之前启动排序过程有点像 hadoop 反模式(如果我可以这样说的话!),因为在所有映射器完成之前,reducer 无法知道没有更多数据要接收。您,调用者可能知道,根据您对键、分区器等的定义,但减速器不知道。

于 2013-05-22T10:57:53.663 回答