设为首页 收藏本站
查看: 973|回复: 0

[经验分享] hadoop二次排序

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-7-12 08:34:12 | 显示全部楼层 |阅读模式
  文章转自:http://blog.iyunv.com/heyutao007/article/details/5890103
  趁这个时候,顺便把hadoop的用于比较的Writable, WritableComparable, Comprator等搞清楚。。
  1.二次排序概念:
  首先按照第一字段排序,然后再对第一字段相同的行按照第二字段排序,注意不能破坏第一次排序的结果 。
  如: 输入文件:
  20 21
50 51   
50 52   
50 53   
50 54   
60 51   
60 53   
60 52   
60 56   
60 57   
70 58   
60 61   
70 54   
70 55   
70 56   
70 57   
70 58   
1 2   
3 4   
5 6   
7 82   
203 21   
50 512   
50 522   
50 53   
530 54   
40 511   
20 53   
20 522   
60 56   
60 57   
740 58   
63 61   
730 54   
71 55   
71 56   
73 57   
74 58   
12 211   
31 42   
50 62   
7 8
  输出(需要分割线):
  ------------------------------------------------   
1       2   
------------------------------------------------   
3       4   
------------------------------------------------   
5       6   
------------------------------------------------   
7       8   
7       82   
------------------------------------------------   
12      211   
------------------------------------------------   
20      21   
20      53   
20      522   
------------------------------------------------   
31      42   
------------------------------------------------   
40      511   
------------------------------------------------   
50      51   
50      52   
50      53   
50      53   
50      54   
50      62   
50      512   
50      522   
------------------------------------------------   
60      51   
60      52   
60      53   
60      56   
60      56   
60      57   
60      57   
60      61   
------------------------------------------------   
63      61   
------------------------------------------------   
70      54   
70      55   
70      56   
70      57   
70      58   
70      58   
------------------------------------------------   
71      55   
71      56   
------------------------------------------------   
73      57   
------------------------------------------------   
74      58   
------------------------------------------------   
203     21   
------------------------------------------------   
530     54   
------------------------------------------------   
730     54   
------------------------------------------------   
740     58
  2.工作原理
  使用如下map和reduce:(特别注意输入输出类型, 其中IntPair为自定义类型)
  public static class Map extends Mapper   
public static class Reduce extends Reducer
  在map阶段,使用job.setInputFormatClass(TextInputFormat)做为输入格式。注意输出应该符合自定义Map中定义的输出。最终是生成一个List。在map阶段的最后,会先调用job.setPartitionerClass对这个List进行分区,每个分区映射到一个reducer。每个分区内又调用job.setSortComparatorClass设置的key比较函数类排序。可以看到,这本身就是一个二次排序。如果没有通过job.setSortComparatorClass设置key比较函数类,则使用key的实现的compareTo方法。在随后的例子中,第一个例子中,使用了IntPair实现的compareTo方法,而在下一个例子中,专门定义了key比较函数类。
  在reduce阶段,reducer接收到所有映射到这个reducer的map输出后,也是会调用job.setSortComparatorClass设置的key比较函数类对所有数据对排序。然后开始构造一个key对应的value迭代器。这时就要用到分组,使用jobjob.setGroupingComparatorClass设置的分组函数类。只要这个比较器比较的两个key相同,他们就属于同一个组,它们的value放在一个value迭代器,而这个迭代器的key使用属于同一个组的所有key的第一个key。最后就是进入Reducer的reduce方法,reduce方法的输入是所有的(key和它的value迭代器)。同样注意输入与输出的类型必须与自定义的Reducer中声明的一致。
  3,具体步骤
  (1)自定义key
  在mr中,所有的key是需要被比较和排序的,并且是二次,先根据partitione,再根据大小。而本例中也是要比较两次。先按照第一字段排序,然后再对第一字段相同的按照第二字段排序。根据这一点,我们可以构造一个复合类IntPair,他有两个字段,先利用分区对第一字段排序,再利用分区内的比较对第二字段排序。   
所有自定义的key应该实现接口WritableComparable,因为是可序列的并且可比较的。并重载方法:

//反序列化,从流中的二进制转换成IntPair  
public void readFields(DataInput in) throws IOException         
//序列化,将IntPair转化成使用流传送的二进制  
public void write(DataOutput out)  
//key的比较  
public int compareTo(IntPair o)         
//另外新定义的类应该重写的两个方法  
//The hashCode() method is used by the HashPartitioner (the default partitioner in MapReduce)  
public int hashCode()   
public boolean equals(Object right)  
  (2)由于key是自定义的,所以还需要自定义一下类:
(2.1)分区函数类。这是key的第一次比较。

public static class FirstPartitioner extends Partitioner
  在job中使用setPartitionerClasss设置Partitioner。
(2.2)key比较函数类。这是key的第二次比较。这是一个比较器,需要继承WritableComparator(也就是实现RawComprator接口)。
  (这个就是前面说的第二种方法,但是在第三部分的代码中并没有实现此函数,而是直接使用compareTo方法进行比较,所以也就不许下面一行的设置)
在job中使用setSortComparatorClass设置key比较函数类。

public static class KeyComparator extends WritableComparator
  2.3)分组函数类。在reduce阶段,构造一个key对应的value迭代器的时候,只要first相同就属于同一个组,放在一个value迭代器。这是一个比较器,需要继承WritableComparator。

public static class GroupingComparator extends WritableComparator  
  分组函数类也必须有一个构造函数,并且重载 public int compare(WritableComparable w1, WritableComparable w2)
分组函数类的另一种方法是实现接口RawComparator。
在job中使用setGroupingComparatorClass设置分组函数类。
另外注意的是,如果reduce的输入与输出不是同一种类型,则不要定义Combiner也使用reduce,因为Combiner的输出是reduce的输入。除非重新定义一个Combiner。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-85646-1-1.html 上篇帖子: Hbase入门笔记( 二 )-- Hadoop单机环境配置 下篇帖子: Hadoop源码之Configuration
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表