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;
}
}
我试图在 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;
}
}