我有一分钟的问题。
我正在尝试从Reducer获取不同密钥的不同文件。
分区器
public class customPartitioner extends Partitioner<Text, NullWritable> implements
Configurable {
private Configuration configuration;
@Override
public Configuration getConf() {
return configuration;
}
public int getPartition(Text key, NullWritable value, int numPartitions) {
return Math.abs(key.hashCode()) % numPartitions;
}
}
我在我的驾驶员类中设置了以下内容
job0.setPartitionerClass(customPartitioner.class);
job0.setNumReduceTasks(5);
对于减速器,我有5个键
[3,0,5,8,12]
所以我需要得到5个不同的文件。
但一旦我运行了这段代码,我就会得到5个部分文件,但结果是意料之中的。
输出
Found 6 items
-rw-r--r-- 3 sreeveni root 0 2015-12-09 11:44 /OUT/Part/OUT/_SUCCESS
-rw-r--r-- 3 sreeveni root 0 2015-12-09 11:44 /OUT/Part/OUT/part-r-00000
-rw-r--r-- 3 sreeveni root 4 2015-12-09 11:44 /OUT/Part/OUT/part-r-00001
-rw-r--r-- 3 sreeveni root 0 2015-12-09 11:44 /OUT/Part/OUT/part-r-00002
-rw-r--r-- 3 sreeveni root 4 2015-12-09 11:44 /OUT/Part/OUT/part-r-00003
-rw-r--r-- 3 sreeveni root 3 2015-12-09 11:44 /OUT/Part/OUT/part-r-00004
其中两个文件为空,另一个包含
sreeveni@machine10:~$ hadoop fs -cat /OUT/Part/OUT/part-r-00001
3
8
sreeveni@machine10:~$ hadoop fs -cat /OUT/Part/OUT/part-r-00003
0
5
sreeveni@machine10:~$ hadoop fs -cat /OUT/Part/OUT/part-r-00004
12
为什么两把钥匙放在一个文件里?
我的代码有错吗?请帮助
您的partitioner正在做正确的事情,所以我将尝试解释原因。让我们将每个输入传递到分区代码中,看看结果如何。numPartitions
是5
,因为它是您设置的减速器数量。
int hash = new Text("3").hashCode(); // = 82
hash % numPartitions; // = 2
hash = new Text("0").hashCode(); // = 79
hash % numPartitions; // = 4
hash = new Text("5").hashCode(); // = 84
hash % numPartitions; // = 4
hash = new Text("8").hashCode(); // = 87
hash % numPartitions; // = 2
hash = new Text("12").hashCode(); // = 2530
hash % numPartitions; // = 0
正如我们所看到的,手动运行它会得到相同的结果。两个键位于一个文件下,因为分区器将它们分配给同一个reducer。分区将在更大的数据集过程中实现均衡,但您不能期望代码自动、均匀地分配所有输入。