什麼是你的輸出密鑰類型?如果您使用的是文字,而不是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從來沒有收到任何價值。
所以像托馬斯Jungblut在他的評論中說,你需要編寫自定義分區到文本值重新轉換成一個整數值,然後分區的總數模這個數字 - 但是這可能仍然不給你「甚至」分佈,如果值本身是不是在1 - 順序(你說他們是如此的你應該確定)
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;
}
}
你必須寫自己的分區中,hashpartitioner不保證完美分配所有任務。 –