Reducer在mapper完成之前启动

时间:2015-06-17 14:05:59

标签: java hadoop mapreduce bigdata

我正在运行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="";
    }       
  }
}

3 个答案:

答案 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占用资源。