大数据,机器学习,人工智能大数据 爬虫Python AI Sql玩转大数据

MapReduce之Combiner与Partitioner

2019-10-28  本文已影响0人  BitGuo

学习资料来源于:
《Hadoop权威指南》
https://github.com/heibaiying/BigData-Notes/blob/master/notes/Hadoop-MapReduce.md
感谢🙏


Combiner

比较熟悉的MapReduce工作流程如下:


此处以统计词汇频率为例,给出如下两张图说明,有无combiner的区别。
without combiner


with combiner
mapreduce-with-combiners.png

可以发现,使用了Combiner之后,传输的键值对的数量由12变成10,在某些实际的应用场景下,Combiner有时能提升数百倍的效率。

partitioner

Partitioner主要适用于某些分类的需求,可以把Partitioner理解为一个分类器,比如要对最终结果按key值分类输出到不同的文件中去,此时就要用到Partitioner

默认的 MapReduce的分类规则

在构建一个Job的时候,如果不指定Partitioner,则默认使用HashPartitioner,对key的值进行取Hash值最后再对numReduceTasks进行取余操作。给出实现如下:

public class HashPartitioner<K, V> extends Partitioner<K, V> {

  public int getPartition(K key, V value,
                          int numReduceTasks) {
    return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
  }
}

自定义分类规则

自定义一个继承了Partitioner的子类,实现getPartitioner方法,最终在主方法中给作业设置分类规则,并且要设置Reducer的数量。

public class CustomPartitioner extends Partitioner<Text, IntWritable> {

    public int getPartition(Text text, IntWritable intWritable, int numPartitions) {
        return WordCountDataUtils.WORD_LIST.indexOf(text.toString());
    }
}
// 设置自定义分区规则
job.setPartitionerClass(CustomPartitioner.class);
// 设置 reduce 个数
job.setNumReduceTasks(WordCountDataUtils.WORD_LIST.size());
上一篇 下一篇

猜你喜欢

热点阅读