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

Posted

技术标签:

【中文标题】如何修复 hadoop 中的“非法分区”错误?【英文标题】:How to fix the "Illegal partition" error in hadoop? 【发布时间】:2013-02-22 19:14:48 【问题描述】:

我已经编写了一个自定义分区器。当我的减少任务数量大于 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

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

【问题讨论】:

【参考方案1】:

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

public int getPartition(weburl_compositeKey key, Text value, int numPartitions)

    return (key.hashCode() & Integer.MAX_VALUE) % numPartitions;

【讨论】:

这个问题有 3 个答案 - 两个正确,一个错误。太糟糕了,唯一不正确的一个获得了最高分和接受的答案标记。 @AndrewSkiba 感谢您指出这一点。我根据 Tanveer 的建议更正了答案。 很高兴看到这一点。 GJ!【参考方案2】:

关于使用的警告:

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);

【讨论】:

【参考方案3】:

或者你可以使用

public int getPartition(weburl_compositeKey key, Text value, int numPartitions)

    return (key.hashCode() & Integer.MAX_VALUE) % numPartitions;

【讨论】:

以上是关于如何修复 hadoop 中的“非法分区”错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 pyspark EMR Notebook 上的错误 - AnalysisException:无法实例化 org.apache.hadoop.hive.ql.metadata.SessionH

如何修复 WordPress 中的 HTTP 错误

如何修复 C++ 中的“分段错误”错误

如何修复 Typescript 中的“以下属性中缺少类型''...”错误?

如何修复 viewDIdLoad 中的 indexPath 错误?

如何修复netbeans中的java语言级别错误