【发布时间】:2014-09-20 15:35:27
【问题描述】:
当我将 reducer 的数量设置为零时,map 阶段完成得非常快(约 10 分钟)。 但是,当我将 reducer 的数量设置为大于 1 时,map 阶段所需的时间(完全相同的 mapper 代码)会急剧增加(我在大约 30 分钟后停止它,而它仍然是 20%)。队列中的第一个map任务达到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");。当我使用reducer时,我也设置了:
conf.setOutputKeyClass(VIntWritable.class);
conf.setOutputValueClass(NullWritable.class);
conf.setMapOutputKeyClass(VIntWritable.class);
conf.setMapOutputValueClass(VIntWritable.class);
否则,我使用:
conf.setOutputKeyClass(VIntWritable.class);
conf.setOutputValueClass(VIntWritable.class);
【问题讨论】: