zoukankan      html  css  js  c++  java
  • MR中的combiner和partitioner


    1.combiner

    combiner是MR编程模型中的一个组件;

    有些任务中map可能会产生大量的本地输出,combiner的作用就是在map端对输出先做一次合并,以减少map和reduce节点之间的数据传输量,提高网络IO性能,是MR的优化手段之一;

    两大基本功能:

    1.1map的输出的key的聚合,对map输出的key排序、value进行迭代;

    1.2reduce功能。

    并不是设置了combiner就一定会执行(在当前集群非常繁忙的时候设置了也不会执行);

    combiner的执行时机:combiner的执行可能会在map的merge之前也可能在之后,这个参数由配置选项min.num.spill.for.combine(默认为3) 决定的,当map端产生的spill文件最少有这么3个时,combiner会在merge操作之前执行,否则之后。

    一般情况下可以使用自己写的reduce类作为combiner,但是特殊情况下也可以自定义

     1 public static class combiner extends Reducer<Text,Text,Text,Text>{
     2     private Text info = new Text();    //为了拆分 key值 准备存储新的value值
     3     public void reduce(Text key,Iterable<Text>values,Context context) throws IOException, InterruptedException{
     4       int sum = 0;
     5       for(Text val:values){
     6         sum += Integer.parseInt(val.toString());
     7       }
     8       int splitIndex = key.toString().indexOf(":");
     9       info.set(key.toString().substring(splitIndex+1)+":"+sum);    //新的value值
    10       key.set(key.toString().substring(0, splitIndex));
    11       context.write(key, info);
    12     }
    13   }
    job.setCombinerClass(combiner.class);

    2.partitioner

    combiner可以减少map的输出到reducer所在节点的网络IO,但是map的输出被分配到哪个reducer上,是由partitioner决定的;

    partitioner只有一个方法:

    getPartition(Text key, Text value, int numPartitions)  

    输入的是map的结果对<key,value>和reducer的数目,返回的则是分配的reducer的编号(整数)。系统缺省的partitioner是HashPartitioner,它以key的Hash值对reducer的数目取模,得到对应的reducer。这样可以保证如果有相同的key值则肯定会被分配到同一个reducer上;
    和combiner一样,一般使用默认的,但是特殊情况也可以自定义

    1 public class NewPartition extends HashPartitioner<Text,Text>{
    2       String keyinfo;
    3       public int getPartition(Text key,Text value,int numReducerTasks){
    4         keyinfo = key.toString().split(":")[0];
    5         return super.getPartition(new Text(keyinfo), value, numReducerTasks);
    6       }
    7     }
    job.setPartitionClass(NewPartition.class);

  • 相关阅读:
    闲聊js中的apply、call和arguments
    字符串操作,文件操作,英文词频统计预处理
    了解大数据的特点、来源与数据呈现方式
    带你精读你不知道的Javasript(上)(一)
    益智小游戏看你能否通关?
    网站性能优化——网页的生成过程
    带着封装的思想顺便实现楼层点亮
    CSS3 傻傻分不清楚的transition, transform 和 animation
    图片轮播的思路
    如何处理跨平台的自适应三
  • 原文地址:https://www.cnblogs.com/admln/p/MR-combiner-partitioner.html
Copyright © 2011-2022 走看看