我正在尝试理解partitioning
中的MapReduce
,并且我发现Hadoop有一个默认分区程序称为HashPartitioner
,而分区程序有助于确定给定密钥将使用哪个reducer去。。
hashcode(key) % NumberOfReducers, where `key` is the key in <key,value> pair.
HashPartitioner
如何计算密钥的哈希码?是简单地调用键的hashCode()还是这个HashPartitioner
使用其他逻辑来计算键的哈希码?
任何人都可以帮我理解这个吗?
答案 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;
}
}