今天在做日志分析的时候遇到一个问题,数据总是对不上(一个是通过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;
}
}
在进行日志分析时,发现MapReduce和Hive计算出的数据结果存在差异。经过排查,问题根源在于Partition的处理不当。修正Partition的设置后,数据匹配成功。
161

被折叠的 条评论
为什么被折叠?



