我正在运行一个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%,然后减速器将启动。
这也将避免在映射器仍在运行时由化简器保留资源。