zoukankan      html  css  js  c++  java
  • MapReduce的自定义分区

    MapReduce有4种Partitioner,如下:
        HashPartitioner<K,V>,默认的分区。
            计算方法:which reducer = (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks
            HashPartitioner是取key的hashCode码与Integer的最大值做运算,得出的结果和reducer的个数取模,最终得到这个key发送到哪个Reducer上。
    KeyFieldBasedPartitioner
    <K2,V2> KeyFieldBasedPartitioner这是基于hash的Partitioner。他提供了多个区间用于计算hash。当区间数为0的时候,KeyFieldBasedPartitioner就变成了HashPartitioner。
    BinaryPartitioner
    <V> BinaryPartitioner继承与Partitioner<BinaryComparable,V>,是Partitioner的字节码自雷。该类提供leftOffset和rightOffset,在计算which reducer时,仅对key-value中的key的[rightOffset,leftOffset]区间取hash。
    TotalOrderPartitioner
    <K extends WritableComparable<?>,V> TotalOrderPartitioner类可以实现输出的全排序。不同于其他三个Partitioner,这个类不是基于hash的。
     1 /**
     2      * Hadoop中有4中分区函数,这里我使用的是默认的HashPartitioner
     3      * 需要与Mapper的输出保持一致的Key和Value类型,添加如下代码:
     4      *         //指定自定义分区函数
     5      *         job.setPartitionerClass(MyPartitioner.class);
     6      *         //Reduce任务数量必须>=分区数量,生产中一般会设置多于分区数量的Reduce任务
     7      *         job.setNumReduceTasks(ReduceNumber);
     8      * @author mengyao
     9      *
    10      */
    11     static class MyPartitioner extends HashPartitioner<Text, LongWritable> {
    12         @Override
    13         public int getPartition(Text key, LongWritable value, int numReduceTasks) {
    14             //实现自己的分区代码
    15             return super.getPartition(key, value, numReduceTasks);
    16         }
    17         
    18     }
  • 相关阅读:
    C++11 指针成员与拷贝构造(浅拷贝与深拷贝)
    C++11 委派构造函数
    C++11 继承构造函数
    C++11 局部和匿名类型作模板实参
    C++11 外部模板
    C++11 函数模板的默认模板参数
    2D游戏新手引导点光源和类迷雾实现
    UVA 12293
    【算法】8 图文搭配诠释三种链表及其哨兵
    小米面试
  • 原文地址:https://www.cnblogs.com/mengyao/p/4865576.html
Copyright © 2011-2022 走看看