Hadoop的默认分区程序:HashPartitioner - 它如何计算密钥的哈希码?

时间:2018-03-08 18:33:58

标签: hadoop mapreduce hadoop2 hashcode reducers

我正在尝试理解partitioning中的MapReduce,并且我发现Hadoop有一个默认分区程序称为HashPartitioner,而分区程序有助于确定给定密钥将使用哪个reducer去。。

从概念上讲,它的工作原理如下:

hashcode(key) % NumberOfReducers, where `key` is the key in <key,value> pair.

我的问题是:

HashPartitioner如何计算密钥的哈希码?是简单地调用键的hashCode()还是这个HashPartitioner使用其他逻辑来计算键的哈希码?

任何人都可以帮我理解这个吗?

1 个答案:

答案 0 :(得分:1)

默认分区程序只使用密钥的hashcode()方法并计算分区。这使您有机会实现hascode()来调整密钥的分区方式。

来自javadoc

public int getPartition(K key,
               V value,
               int numReduceTasks)
Use Object.hashCode() to partition.

对于实际代码,它只返回(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks

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

编辑:在自定义分区器上添加详细信息

您可以为分区器添加不同的逻辑,甚至可能根本不使用hashcode()

可以通过扩展Partitioner

来编写自定义分区程序
public class CustomPartitioner extends Partitioner<Text, Text>

一个这样的例子,它适用于自定义密钥对象的属性:

public static class CustomPartitioner extends Partitioner<Text, Text>{
@Override
public int getPartition(Text key, Text value, int numReduceTasks){
    String emp_dept = key.getDepartment();
    if(numReduceTasks == 0){
        return 0;
    }

    if(key.equals(new Text(“IT”))){
        return 0;
    }else if(key.equals(new Text(“Admin”))){
        return 1 % numReduceTasks;
    }else{
        return 2 % numReduceTasks;
    }
}