Partition取值

来源:互联网 发布:淘宝网秧歌服山东菏泽 编辑:程序博客网 时间:2024/06/05 19:21

   今天在做日志分析的时候遇到一个问题,数据总是对不上(一个是通过Mapreduce计算,另一个通过hive计算的),找了半天,发现时以下错误:

java.io.IOException: Illegal partition for com.sohu.tv.amstat.mr.AdvBookFlightSummary$CompositeKey@63d87b85 (-3)at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:1073)at org.apache.hadoop.mapred.MapTask$NewOutputCollector.write(MapTask.java:691)at org.apache.hadoop.mapreduce.TaskInputOutputContext.write(TaskInputOutputContext.java:80)at com.sohu.tv.amstat.mr.AdvBookFlightSummary$AdMapper.map(AdvBookFlightSummary.java:265)at com.sohu.tv.amstat.mr.AdvBookFlightSummary$AdMapper.map(AdvBookFlightSummary.java:203)at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)at org.apache.hadoop.mapred.Child$4.run(Child.java:255)at java.security.AccessController.doPrivileged(Native Method)at javax.security.auth.Subject.doAs(Subject.java:396)at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1083)

    可以看出,partitionor返回的值是-3,所以才会抛出这个异常,我看了下我的partionor代码:

public static class AdvBookFlightPartition extends Partitioner<CompositeKey, CompositeVal> {        @Override        public int getPartition(CompositeKey key, CompositeVal value, int nums) {            return key.getRt().hashCode() % nums;        }    }
    hashCode方法会返回一个负值,所以取模后,partition的值是负数。

修正后即可:

public static class AdvBookFlightPartition extends Partitioner<CompositeKey, CompositeVal> {        @Override        public int getPartition(CompositeKey key, CompositeVal value, int nums) {            return Math.abs(key.getRt().hashCode()) % nums;        }    }

原创粉丝点击