如何在所有映射器的shuffle完成之前在hadoop中开始排序和减少?

时间:2013-05-22 10:02:55

标签: hadoop

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

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

  1. mapperA完成
  2. shuffles复制mapper的相应分区。输出让我们说减速器1和2
  3. 对reducer 1和2进行排序,开始排序和缩减并生成一些中间输出
  4. 现在mapperB完成
  5. shuffle将mapperBs输出的相应分区复制到reducer 1和2
  6. 对reducer 1和2进行排序和减少再次启动,reducer将新输出与旧输出合并
  7. 这可能吗?感谢

3 个答案:

答案 0 :(得分:3)

您不能使用当前的实现。但是,人们已经“破解”了Hadoop代码以执行您想要执行的操作。

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

然而,正如"Breaking the MapReduce Stage Barrier"论文所指出的,对于某些应用程序,不等待映射器的所有输出都是有意义的。如果您希望实现此类行为(最有可能用于研究目的),那么您应该查看实现org.apache.hadoop.mapred.ReduceTask.ReduceCopier的{​​{1}}类。

编辑:最后,正如@teo在此相关SO question中指出的那样,

  

ShuffleConsumerPlugin方法是持有reduce的方法   任务从运行直到所有地图输出都被复制(通过while   循环在Hadoop版本1.0.4的第2026行。

答案 1 :(得分:2)

您可以使用slowstart属性对其进行配置,该属性表示在复制到reducers之前需要完成的映射器的百分比。它通常默认为0.9 - 0.95(90-95%)标记,但如果你想要,你可以覆盖为0

`mapreduce.reduce.slowstart.completed.map`

答案 2 :(得分:1)

在所有映射器完成之前启动排序过程是一种hadoop-antipattern(如果我可以这样说的话!),因为reducers无法知道在所有映射器完成之前没有更多数据要接收。你,调用者可能知道,根据你对键,分区等的定义,但是减速器没有。