分享

job.setGroupingComparatorClass无法正常执行

yameing 发表于 2014-11-20 16:07:49 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 7 24295
执行example包里的SecondarySort,发现结果正常,也就是说,hadoop框架是没问题的,出问题的是我的程序,下面详细说明程序出现的问题:

情况一、不设置GroupingComparatorClass
  1. Job userActivityJob = Job.getInstance(userActivityConf);
  2. userActivityJob.setJarByClass(UserActivity.class);
  3. userActivityJob.setMapperClass(UserActivityMapper.class);
  4. userActivityJob.setPartitionerClass(UserActivityPartitioner.class);
  5. //userActivityJob.setGroupingComparatorClass(UserActivityGroupingComparator.class);
  6. userActivityJob.setReducerClass(UserActivityReducer.class);
  7. userActivityJob.setOutputKeyClass(UserActivityKeyWritable.class);
  8. userActivityJob.setOutputValueClass(UserActivityValueWritable.class);
复制代码
结果:("****"这个是写在reduce的开始和结束的地方,用于界定一个reduce)
前两个字段是输入的key,其他都是输入的value
  1. 1        414030933742050        **********************
  2. 1        414030933742050                4.1.0.2ctch1        1        414030933742050        MainActivity        1411378349000        1411378368000        1       
  3. 1        414030933742050                **********************
  4. 1        414030933742050        **********************
  5. 1        414030933742050                4.1.0.2ctch1        1        414030933742050        AppDetailActivty        1411378368000        1411378379000        1       
  6. 1        414030933742050                **********************
  7. 1        455020096740852        **********************
  8. 1        455020096740852                4.1.0.2ctch1        1        455020096740852        MainActivity        1413546169000        1413546170000        1       
  9. 1        455020096740852                **********************
  10. 1        455020096898038        **********************
  11. 1        455020096898038                4.6.0.3        1        455020096898038        MainActivity        1408844760000        1408844786000        1       
  12. 1        455020096898038                **********************
  13. 1        455020096898038        **********************
  14. 1        455020096898038                4.6.0.3        1        455020096898038        MainActivity        1408844788000        1408844792000        1       
  15. 1        455020096898038                **********************
复制代码

情况二:设置GroupingComparatorClass
  1. @Override
  2. public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
  3.      return WritableComparator.compareBytes(b1, s1, Integer.SIZE / 8,b2, s2, Integer.SIZE / 8);
  4. }
  5. /**
  6. * 按照(APP_ID + IMSI)分组
  7. */
  8.         @Override
  9.         public int compare(UserActivityKeyWritable o1,UserActivityKeyWritable o2) {
  10.                        
  11.     int i = o1.getAppId().compareTo(o2.getAppId());
  12.     if (i != 0) {
  13.         return i;
  14.     } else {
  15.         i = o1.getClientImsi().compareTo(o2.getClientImsi());
  16.         if (i != 0) {
  17.             return i;
  18.         } else {
  19.             return 0;
  20.         }
  21.                 }
  22.         }
  23. }
复制代码

结果:
  1. 1        414030933742050        **********************
  2. 1        414030933742050                4.1.0.2ctch1        1        414030933742050        MainActivity        1411349549000        1411349568000        1       
  3. 1        414030933742050                4.1.0.2ctch1        1        414030933742050        AppDetailActivty        1411349568000        1411349579000        1       
  4. 1        414030933742050                4.1.0.2ctch1        1        455020096740852        MainActivity        1413517369000        1413517370000        1       
  5. 1        414030933742050                4.6.0.3        1        455020096898038        MainActivity        1408815960000        1408815986000        1       
  6. 1        414030933742050                4.6.0.3        1        455020096898038        MainActivity        1408815988000        1408815992000        1       
  7. 1        414030933742050                4.6.0.3        1        455020096898038        WebViewActivity        1408815992000        1408815994000        1       
  8. 1        414030933742050                4.6.0.3        1        455020096898038        MainActivity        1408815994000        1408816024000        1       
  9. 1        414030933742050                4.6.0.3        1        455020096898038        MainActivity        1408816089000        1408816090000        1       
  10. 1        414030933742050                4.6.0.3        1        455020096898038        MainActivity        1408898411000        1408898428000        1       
  11. 1        414030933742050                4.6.0.3        1        455020096898038        MainActivity        1408920621000        1408920623000        1       
  12. 1        414030933742050                4.6.0.3        1        455020096898038        AppDetailActivty        1408920623000        1408920638000        1       
  13. 1        414030933742050                4.6.0.3        1        455020096898038        MainActivity        1408920638000        1408920804000        1       
  14. 1        414030933742050                4.6.0.3        1        455020096898038        MainActivity        1408920886000        1408920925000        1       
  15. 1        414030933742050                4.6.0.3        1        455020096898038        MainActivity        1408920927000        1408920929000        1       
复制代码

情况三:设置GroupingComparatorClass,修改Comparator类
  1. public static class UserActivityGroupingComparator implements RawComparator<UserActivityKeyWritable> {
  2.     @Override
  3.     public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
  4.         return WritableComparator.compareBytes(b1, s1, Integer.SIZE / 8,b2, s2, Integer.SIZE / 8);
  5.     }
  6.     /**
  7.     * 按照(APP_ID + IMSI)分组
  8.     */
  9.     @Override
  10.     public int compare(UserActivityKeyWritable o1,UserActivityKeyWritable o2) {
  11.         return -1 ;
  12.     }
  13. }
复制代码

结果:
无论是返回0,1,-1,结果都跟情况二一样


这是什么情况呢?是不是哪里配置错了?我找了两天,没找出来






已有(7)人评论

跳转到指定楼层
bioger_hit 发表于 2014-11-20 16:29:35
设置GroupingComparatorClass,建议楼主参考下面形式,compare里面楼主没有做任何的操作,就是返回了一个-1

  1. public class NaturalKeyGroupComparator extends WritableComparator {
  2.     public NaturalKeyGroupComparator() {
  3.         super(SortKeyPair.class, true);
  4.     }
  5.     @Override
  6.     public int compare(WritableComparable a, WritableComparable b) {
  7.         SortKeyPair s1 = (SortKeyPair) a;
  8.         SortKeyPair s2 = (SortKeyPair) b;
  9.         int res = s1.getCount() < s2.getCount() ? 1 : (s1.getCount() == s2
  10.                 .getCount() ? 0 : -1);
  11.         return res;
  12.     }
  13. }
复制代码



回复

使用道具 举报

yameing 发表于 2014-11-20 16:31:26
bioger_hit 发表于 2014-11-20 16:29
设置GroupingComparatorClass,建议楼主参考下面形式,compare里面楼主没有做任何的操作,就是返回了一个-1 ...

额,您可能没看清楚,我写的情况二中,有一定的判断逻辑,但是没达到预期效果,然后我就写了个情况三,情况三无论返回什么,结果都是一样,也就是说,设置的这个类根本就没起到任何效果
回复

使用道具 举报

bioger_hit 发表于 2014-11-20 16:42:48
yameing 发表于 2014-11-20 16:31
额,您可能没看清楚,我写的情况二中,有一定的判断逻辑,但是没达到预期效果,然后我就写了个情况三,情 ...

程序中为何为重写两个compare
可以比较一下,楼主写的与刚贴出的内容

回复

使用道具 举报

wjhdtx 发表于 2014-11-20 16:57:52
在reduce方法中,会构造一个key对应的value迭代器,这时就要用到分组,使用job.setGroupingComparatorClass设置的分组函数类。只要这个比较器比较的两个key相同,他们就属于同一个组,它们的value放在一个value迭代器,而这个迭代器的key使用属于同一个组的所有key的第一个key。
回复

使用道具 举报

yameing 发表于 2014-11-20 16:59:27
wjhdtx 发表于 2014-11-20 16:57
在reduce方法中,会构造一个key对应的value迭代器,这时就要用到分组,使用job.setGroupingComparatorClass ...

我想着比较器无论返回什么,结果都一样,请参考文中的情况三
回复

使用道具 举报

yameing 发表于 2014-11-20 17:11:48
bioger_hit 发表于 2014-11-20 16:42
程序中为何为重写两个compare
可以比较一下,楼主写的与刚贴出的内容

非常感谢,用您的这个方法可行了,达到了预期结果

实际上,您的这种方法和我的方法应该都是可行的才是,我参考的hadoop的example也是使用我的这种方式
很奇怪,我的这种方式就是不work
回复

使用道具 举报

zhujun182104906 发表于 2014-11-21 10:54:43
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条