使用reducer会减慢映射器的速度

时间:2014-07-29 09:41:36

标签: hadoop io mapreduce

当我将减速器的数量设置为零时,地图阶段完成得非常快(约10分钟)。 但是,当我将减速器的数量设置为大于1时,映射阶段所需的时间(完全相同的映射器代码)会急剧增加(我在约30分钟后停止它,而它仍然是20%)。队列中的第一个地图任务达到100%,然后进程停滞。

任何直觉?是不是在没有使用reducer的情况下,map输出直接进入磁盘,而当使用reduce阶段时,map输出会进入内存缓冲区?

我的主映射器循环的伪代码如下:

for (VIntWritable e1 : D2entities) {                    
    for (VIntWritable e1 : D1entities) {    
       output.collect(e1, e2);
    }           
}

在这两种情况下,我都使用conf.setCompressMapOutput(true)conf.set("mapred.reduce.slowstart.completed.maps", "1.00");。当我使用减速器时,我也设置了:

conf.setOutputKeyClass(VIntWritable.class);     
conf.setOutputValueClass(NullWritable.class);       

conf.setMapOutputKeyClass(VIntWritable.class);
conf.setMapOutputValueClass(VIntWritable.class);

否则,我使用:

conf.setOutputKeyClass(VIntWritable.class);     
conf.setOutputValueClass(VIntWritable.class);

1 个答案:

答案 0 :(得分:3)

当您将减速器数量设置为0时,您正在执行仅限地图的作业。这意味着数据不会被排序也不会被洗牌,映射器的输出将直接写入磁盘。但是,如果使用reducer,则有两种情况:当您只需要对数据进行排序时,以及何时还需要对数据执行某些聚合或某些操作。

如果您只需要对数据进行排序,您可以使用身份缩减器,它将对数据进行排序,执行随机播放,将其提供给reducer,然后将其写入磁盘。在第二种情况下,减速器需要额外的时间来执行您希望执行的操作,无论是聚合还是其他任何操作。

所以是的,在做地图专用工作时,以及在编写减少阶段时,时间差异很大。请考虑下面的图片,如果在地图之后直接将其写入磁盘,则无需执行以下所有步骤:

map reduce phases

编辑:添加缩减阶段时,您会看到地图制作者达到100%,但看起来并不完整,因为出于效率原因在地图阶段进行了一些预分类处理,一些缓冲写入内存。因此,当您将作业仅作为地图编写时,这不会完成,并且完成得更快。但是,现在您还使用了reducer,一旦它达到映射器的100%,它就会从内存中的预分配和缓冲开始,并且在完成之前它不会显示为“已完成”。

map side

希望现在更清楚了!