zoukankan      html  css  js  c++  java
  • 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过程:
      
  • 相关阅读:
    python中不同文件中函数和类的调用
    python中使用queue实现约瑟夫环(约瑟夫问题)求解
    C语言中几个常用数学计算函数ceil(), floor(), round()的用法
    python中stack在实际中的简单应用之进制转换
    python中stack在实际中的简单应用之平衡符号
    python中两种栈实现方式的性能对比
    python实现stack并测试
    昨天的面试的一点思考
    从历代帝王的的创业经历看哪些人适合创业
    python chr()和ord()的含义和使用方法
  • 原文地址:https://www.cnblogs.com/Zchaowu/p/7368457.html
Copyright © 2011-2022 走看看