如何解决hadoop中的"非法分区"错误?

Mav*_*ick 8 java hadoop mapreduce

我写了一个自定义分区器.当我有大于1的reduce任务数时,作业失败.这是我得到的例外情况:

 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)
Run Code Online (Sandbox Code Playgroud)

我写的代码是

public int getPartition(weburl_compositeKey key, Text value, int numPartitions)
{
    return (key.hashCode()) % numPartitions;
}
Run Code Online (Sandbox Code Playgroud)

这个值的key.hashCode()equals -719988079和mod正在返回-1.

感谢您对此的帮助.谢谢.

har*_*pun 21

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

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