mapreduce中的combiner、partitioner、Shuffle

一.combiner

  combiner不是mapreduce的一个必备过程,是由开发者选择是否使用的,是mapreduce的一种优化手段。

  combiner的作用:combiner是为了解决mapreduce过程中的两个性能瓶颈,1.网络宽带严重被占降低程序效率,2.单一节点承载过重降低程序效率。所以性能有以下两个作用:

    1.combiner实现本地key的聚合,对map输出的key排序value进行迭代

    2.combiner还有本地reduce功能(其本质上就是一个reduce).

  什么时候运行Combiner?

    1、当job设置了Combiner,并且spill的个数到min.num.spill.for.combine(默认是3)的时候,那么combiner就会Merge之前执行;
    2、但是有的情况下,Merge开始执行,但spill文件的个数没有达到需求,这个时候Combiner可能会在Merge之后执行;
    3、Combiner也有可能不运行,Combiner会考虑当时集群的一个负载情况。如果集群负载量很大,会尽量提早执行完map,空出资源,所以,就不会去执行。

                  

              

  对于Combiner有几点需要说明的是:

    1)有很多人认为这个combiner和map输出的数据合并是一个过程,其实不然,map输出的数据合并只会产生在有数据spill出的时候,即进行merge操作。

    2)与mapper与reducer不同的是,combiner没有默认的实现,需要显式的设置在conf中才有作用。

    3)并不是所有的job都适用combiner,只有操作满足结合律的才可设置combiner。combine操作类似于:opt(opt(1, 2, 3), opt(4, 5, 6))。如果opt为求和、求最      大值的话,可以使用,但是如果是求中值的话,不适用。

    4)一般来说,combiner和reducer它们俩进行同样的操作。

  

二、partitioner

用户在中间key上使用分区函数来对数据进行分区,之后在输入到后续任务执行进程。
一个默认的分区函数式使用hash方法(比如常见的:hash(key) mod R)进行分区。hash方法能够产生非常平衡的分区。
因为不同的Key的hashcode可能一样,所以一个不同的key可能被分到同一个reduce节点上。源码:
Hadoop中自带了一个默认的分区类HashPartitioner,
它继承了Partitioner类,提供了一个getPartition的方法
/** Partition keys by their {@link Object#hashCode()}. */
public class HashPartitioner<K, V> extends Partitioner<K, V> {
  /** Use {@link Object#hashCode()} to partition. */
  public int getPartition(K key, V value,int numReduceTasks) {
    return
(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
  }    
 }   
 
 
三、shuffle
针对多个map任务的输出按照不同的分区(Partition)通过网络复制到不同的reduce任务节点上,这个过程就称作为Shuffle。
Hadoopshuffle过程就是从map端输出到reduce端输入之间的过程,这一段应该是Hadoop中最核心的部分,因为涉及到Hadoop中最珍贵的网络资源,所以shuffle过程中会有很多可以调节   的参数,也有很多策略可以研究
shuffle过程:
  
原文地址:https://www.cnblogs.com/Zchaowu/p/7368457.html