化简器在映射器完成之前启动



我正在运行一个Map Reduce程序。但是,即使我只使用映射器或同时使用映射器和减速器运行它,我也得到了类似的输出。

在此之后,它永远不会完成。它挂在那里。

我不明白为什么减速器在映射器完成 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="";
    }       
  }
}

reduce阶段有3个步骤:随机,排序,减少。随机播放是化简器从每个映射器收集数据的地方。映射器生成数据时可能会发生这种情况,因为它只是数据传输。另一方面,排序和减少只有在所有映射器完成后才能开始。你可以通过查看化简器完成百分比来判断MapReduce正在做哪一个:0-33%表示它正在洗牌,34-66%是排序,67%-100%是减少。这就是为什么你的化简器有时会看起来"卡"在 33% 上——它正在等待映射器完成。

这是由mapreduce.job.reduce.slowstart.completedmaps设置控制的。 默认情况下,一旦完成 5% 的地图,就会安排缩减。 这通常只启动化简器的复制阶段。 映射完成后,每个化简器将排序并减少输入(映射器的输出)。

将配置"mapreduce.job.reduce.slowstart.completemaps"的值设置得尽可能高(我们通常遵循将其设置为0.96到0.98左右的做法)。这将使映射器完成 96% 到 98%,然后减速器将启动。

这也将避免在映射器仍在运行时由化简器保留资源。

相关内容

  • 没有找到相关文章

最新更新