我正在运行Map Reduce计划。但是我得到了类似的输出,即使我只使用mapper或者使用mapper和reducer运行它。
在此之后它永远不会完成。它挂在那里。
我不知道为什么reducer在mapper完成100%之前就开始了?什么可能是潜在的问题?
输出:
Map 10% Reduce 0%
Map 19% Reduce 0%
Map 21% Reduce 0%
Map 39% Reduce 0%
Map 49% Reduce 0%
Map 63% Reduce 0%
Map 67% Reduce 0%
Map 68% Reduce 0%
Map 68% Reduce 22%
Map 69% Reduce 22%
这是一个映射器代码:
public class EntityCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
static String total_record="";
@Override
protected void map(LongWritable baseAddress, Text line, Context context)
throws IOException, InterruptedException {
Text entity=new Text();
IntWritable one=new IntWritable(1);
total_record=total_record.concat(line.toString());
String[] fields=total_record.split("::");
if(fields.length==24)
{
entity.set(fields[22].trim());
context.write(entity,one);
total_record="";
}
}
}
答案 0 :(得分:5)
这由mapreduce.job.reduce.slowstart.completedmaps
设置控制。默认情况下,只有5%的地图完成后,才会安排减少。这通常只启动减速器的复制阶段。一旦映射完成,每个reducer将对输入进行排序和减少(来自映射器的输出)。
答案 1 :(得分:3)
减少阶段有3个步骤:随机,排序,减少。 Shuffle是每个映射器的reducer收集数据的地方。当映射器生成数据时会发生这种情况,因为它只是数据传输。另一方面,只有在完成所有映射器后才能启动sort和reduce。你可以通过查看减速器完成百分比来判断MapReduce正在做什么:0-33%意味着它正在进行洗牌,34-66%是排序,67%-100%是减少。这就是为什么你的减速器有时看起来“卡住”33% - 它正在等待地图制作者完成。
答案 2 :(得分:0)
将config“ mapreduce.job.reduce.slowstart.completedmaps”的值设置为尽可能高的值(通常按照惯例将其设置为0.96到0.98)。这将使映射器完成96%到98%的操作,然后将启动reducer。
这还将避免当映射器仍在运行时reducer占用资源。