【单点】每日突破,MapReduce分区

2021-09-10 11:09:44 浏览数 (1)

MapReduce分区

问:MapReduce在进行HashPartitoner时,会获取key的hashCode,之后为什么要与Integer.MAX_VALUE进行逻辑与计算?

答:

  • 源码部分如下
代码语言:javascript复制
public class HashPartitioner<K, V> extends Partitioner<K, V> {

  /** Use {@link Object#hashCode()} to partition. */
  public int getPartition(K key, V value,
                          int numReduceTasks) {
    return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
  }

}
  • (key.hashCode() & Integer.MAX_VALUE),因为Integer.MAX_VALUE最高位是符号位0,表示正数。如果hashCode得到的值为负数,符号位为1,会影响哈希取模的结果(Partition不能为负),此时进行逻辑与计算后,会变成一个正整数,从而保证取模结果正确。

问:如何实现自定义Partitioner?

答:

  • 创建自定义类,继承Partitioner,重写getPartition方法。
代码语言:javascript复制
public class MyPartitioner extends Partitioner<Text, IntWritable> {

    @Override
    public int getPartition(Text key, IntWritable value, int numPartitions) {
        // TODO Auto-generated method stub
        return 0;
    }

}
  • 在Job中设置setPartitionerClass,并配置ReduceTask数量。
代码语言:javascript复制
job.setNumReduceTasks(5);
job.setPartitionerClass(MyPartitioner.class);

今天的单点,你是否get到了呢?每日单点,用5分钟收获一点!今天你打卡了没?


后话

如果有帮助的,记得点赞、关注。在公众号《数舟》中,可以免费获取专栏《数据仓库》配套的视频课程、大数据集群自动安装脚本,并获取进群交流的途径。

我所有的大数据技术内容也会优先发布到公众号中。如果对某些大数据技术有兴趣,但没有充足的时间,在群里提出,我为大家安排分享。

0 人点赞