• MapReduce优化


      Combiner和Partitioner是用来优化MapReduce的,可以提高MapReduce的运行效率。下面我们来具体学习这两个组件

    Combiner

      我们以WordCount为例,首先通过下面的示意图直观的了解一下Combiner的位置和作用

      clip_image001

      从上图可以看出,Combiner介于 Mapper和Reducer之间,combine作为 Map任务的一部分,执行完 map 函数后紧接着执行combine,而reduce 必须在所有的 Map 任务完成后才能进行。 而且还可以看出combine的过程与reduce的过程类似,都是对相同的单词key合并其词频,很多情况下可以直接使用reduce函数来完成Combiner过程。

      通过上面的分析,下面我们将深入理解 Combiner组件。

      1、Combiner可以看做局部的Reducer(local reducer)。

        1)Combiner作用是合并相同的key对应的value。

        2)在Mapper阶段,不管Combiner被调用多少次,都不应改变 Reduce的输出结果。

        3)Combiner通常与Reducer的逻辑是一样的,一般情况下不需要单独编写Combiner,直接使用Reducer的实现就可以了。

        4)Combiner在Job中是如下设置的

          job.setCombinerClass(Reducer.class);

          // Combiner一般情况下,默认使用Reducer的实现

      2、Combiner的好处

        1)能够减少Map Task输出的数据量(即磁盘IO)。我们前面提到Map Task 将输出的数据写到本地磁盘,它输出的数据量越多,它写入磁盘的数据量就越大,那么开销就越大,速度就越慢。

        2)能够减少Reduce-Map网络传输的数据量(网络IO)。这个很好理解,Map Task 输出越少,Reduce从Map结果中拉取的数据量就越少,自然就减少了网络传输的数据量。

      3、Combiner 的使用场景

        1)并不是所有的场景都可以使用Combiner,必须满足结果可以累加。

        2)适合于Sum()求和,并不适合Average()求平均数。例如,求0、20、10、25和15的平均数,直接使用Reduce求平均数Average(0,20,10,25,15),得到的结果是14, 如果先使用Combiner分别  对不同Mapper结果求平均数,Average(0,20,10)=10,Average(25,15)=20,再使用Reducer求平均数Average(10,20),得到的结果为15,很明显求平均数并不适合使用Combiner。

    Partitioner

      我们通过如下示意图,很直观的看到 Partitioner 的位置和作用。

      clip_image003

      从上图我们可以看出,Partitioner 处于 Mapper阶段,当Mapper处理好数据后,这些数据需要经过Partitioner进行分区,来选择不同的Reducer处理,从而将Mapper的输出结果均匀的分布在Reducer上面执行。

      通过上面的分析,下面我们将深入理解 Partitioner组件。

      1、Partitioner决定了Map Task 输出的每条数据交给哪个Reduce Task 来处理。Partitioner 有两个功能:

        1)均衡负载。它尽量将工作均匀地分配给不同的 Reduce。

        2)效率。它的分配速度一定要非常快。

      2、Partitioner 的默认实现:hash(key) mod R,这里的R代表Reduce Task 的数目,意思就是对key进行hash处理然后取模。很多情况下,用户需要自定义 Partitioner,比如“hash(hostname(URL)) mod R”,它确保相同域名下的网页交给同一个 Reduce Task 来处理。 用户自定义Partitioner,需要继承Partitioner类,实现它提供的一个方法

        getPartition(Text key, Text value, int numPartitions);

        前两个参数分别为Map的key和value。numPartitions 为 Reduce 的个数,用户可以自己设置。

    如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
    如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
    如果,您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是【刘超★ljc】。

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    WPF ViewModel 调用任意前台控件的方法
    xxxx
    modelsim一些error(warning)的原因
    [verilog] inout端口处理
    [c语言]指针数组和数组指针
    电机控制术语
    MAC和PHY关系
    IAR map文件说明
    [corterm3]汇编语法
    TI 2802x系列中断系统及应用
  • 原文地址:https://www.cnblogs.com/codeOfLife/p/5472713.html
Copyright © 2020-2023  润新知