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

Hadoop's default partitioner: HashPartitioner - How it calculates hash-code of a key?

我试图在 MapReduce 中理解 partitioning,我开始知道 Hadoop 有一个默认的分区器,称为 HashPartitioner,分区器帮助决定给定的减速器关键会去。

从概念上讲,它是这样工作的:

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

我的问题是:

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

谁能帮我理解一下?

默认的分区器简单地使用hashcode()键的方法并计算分区。这使您有机会实施 hascode() 来调整密钥的分区方式。

来自javadoc

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

对于实际代码,它只是 returns (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;
    }
}