我从When do reduce tasks start in Hadoop了解到,hadoop中的reduce任务包含三个步骤:shuffle,sort和reduce,其中sort(以及之后的reduce)只能在所有映射器完成后才能启动。有没有办法在每次映射器完成时开始排序并减少。
例如,让我们只有一个作业使用映射器mapperA和mapperB以及2个reducer。我想做的是:
这可能吗?感谢
答案 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无法知道在所有映射器完成之前没有更多数据要接收。你,调用者可能知道,根据你对键,分区等的定义,但是减速器没有。