java—如何修复hadoop中的“非法分区”错误?

bjg7j2ky  于 2021-06-04  发布在  Hadoop
关注(0)|答案(3)|浏览(333)

我写了一个自定义分区器。当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 .
感谢你在这方面的帮助。谢谢。

f4t66c6m

f4t66c6m1#

或者你可以用

public int getPartition(weburl_compositeKey key, Text value, int numPartitions)
{
    return (key.hashCode() & Integer.MAX_VALUE) % numPartitions;
}
cnjp1d6j

cnjp1d6j2#

关于使用的警告:

public int getPartition(weburl_compositeKey key, Text value, int numPartitions)
{
    return Math.abs(key.hashCode()) % numPartitions;
}

如果你碰到 key.hashCode() 等于 Integer.MIN_VALUE 你仍然会得到一个负的分区值。这是java的一个奇怪之处,但是 Math.abs(Integer.MIN_VALUE) 退货 Integer.MIN_VALUE (如-2147483648)。取模数的绝对值更安全,如:

public int getPartition(weburl_compositeKey key, Text value, int numPartitions)
{
    return Math.abs(key.hashCode() % numPartitions);
}
3okqufwl

3okqufwl3#

您自定义的计算分区号 Partitioner 必须是非负的。尝试:

public int getPartition(weburl_compositeKey key, Text value, int numPartitions)
{
    return (key.hashCode() & Integer.MAX_VALUE) % numPartitions;
}

相关问题