我写了一个自定义分区器。当reduce任务数大于1时,作业失败。这是我得到的例外:
java.io.IOException: Illegal partition for weburl_compositeKey@804746b1 (-1)
at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:930)
at org.apache.hadoop.mapred.MapTask$OldOutputCollector.collect(MapTask.java:499)
我写的代码是
public int getPartition(weburl_compositeKey key, Text value, int numPartitions)
{
return (key.hashCode()) % numPartitions;
}
这就是 key.hashCode()
等于 -719988079
这个值的mod正在返回 -1
.
感谢你在这方面的帮助。谢谢。
3条答案
按热度按时间f4t66c6m1#
或者你可以用
cnjp1d6j2#
关于使用的警告:
如果你碰到
key.hashCode()
等于Integer.MIN_VALUE
你仍然会得到一个负的分区值。这是java的一个奇怪之处,但是Math.abs(Integer.MIN_VALUE)
退货Integer.MIN_VALUE
(如-2147483648)。取模数的绝对值更安全,如:3okqufwl3#
您自定义的计算分区号
Partitioner
必须是非负的。尝试: