mapreduce中combiner和in-mapper combiner的区别?

q5lcpyga  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(450)

我是hadoop和mapreduce的新手。有人能解释一下合路器和Map合路器之间的区别吗?还是它们是同一件事?

kd3sttzy

kd3sttzy1#

您可能已经意识到,组合器是在每个Map器机器上本地运行的一个进程,它在数据通过网络被洗牌到各种集群缩减器之前预先聚合数据。
in-mapper组合器将这种优化做得更进一步:聚合甚至不写入本地磁盘:它们发生在Map器本身的内存中。
in-mapper组合器通过利用

org.apache.hadoop.mapreduce.Mapper

要创建内存中的Map,请执行以下操作:

Map<LongWritable, Text> inmemMap = null
   protected void setup(Mapper.Context context) throws IOException, InterruptedException {
   inmemMap  = new Map<LongWritable, Text>();
 }

然后在每次map()调用期间,将值添加到内存中的Map(而不是对每个值调用context.write())。最后,map/reduce框架将自动调用:

protected void cleanup(Mapper.Context context) throws IOException, InterruptedException {
  for (LongWritable key : inmemMap.keySet()) {
      Text myAggregatedText = doAggregation(inmemMap.get(key))// do some aggregation on 
                   the inmemMap.     
      context.write(key, myAggregatedText);
  }
}

请注意,不是每次都调用context.write(),而是向内存Map中添加条目。然后在cleanup()方法中调用context.write(),但使用内存Map中的压缩/预聚合结果。因此,本地map输出spool文件(将由reducer读取)将小得多。
在这两种情况下,无论是内存还是外部合并器中,由于Mapspool文件较小,您都可以获得减少还原器网络通信量的好处。这也减少了减速机的加工。

相关问题