你的输出键类型是什么?如果您使用的是 Text 而不是 IntWritable (我假设您必须像使用流式传输一样),则减少数是根据字节表示的哈希值计算的,即键值的 UTF-8“字符串”。您可以编写一个简单的单元测试来观察这一点:
public class TextHashTest {
@Test
public void testHash() {
int partitions = 30;
for (int x = 0; x < 100; x++) {
int hash = new Text(String.valueOf(x)).hashCode();
int part = hash % partitions;
System.err.printf("%d = %d => %d\n", x, hash, part);
}
}
}
我不会粘贴输出,但在 100 个值中,分区箱 0-7 永远不会收到任何值。
因此,就像Thomas Jungblut在他的评论中所说,您需要编写一个自定义分区器将 Text 值转换回整数值,然后将该数字与分区总数取模 - 但这可能仍然不会给您“偶数”如果值本身不在 1-up 序列中,则分布(你说它们是这样的,所以你应该没问题)
public class IntTextPartitioner implements Partitioner<Text, Text> {
public void configure(JobConf job) {}
public int getPartition(Text key, Text value, int numPartitions) {
return Integer.valueOf(key.toString()) % numPartitions;
}
}