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     }
  • 相关阅读:
    Mythological VI
    新访问计划
    数学小记
    【Learning】带花树——一般图最大匹配
    朋友
    【bzoj 1414】对称的正方形 单调队列+manacher
    【半集训记录】
    【codeforces 718E】E. Matvey's Birthday
    【codeforces 718 C&D】C. Sasha and Array&D. Andrew and Chemistry
    【bzoj 3233】[Ahoi2013]找硬币 ——搜索
  • 原文地址:https://www.cnblogs.com/mengyao/p/4865576.html
Copyright © 2011-2022 走看看