您现在的位置是:首页 > 文章详情

MapReduce框架排序和分组

日期:2015-08-06点击:534

前言:

        Mapreduce框架就是map->reduce,其中Map中的<key,value>是偏移量和行值,在其之前会使用job.setInputFormatClass定义的InputFormat将输入的数据集分割成小数据块splites,同时InputFormat提供一个RecordReder的实现。本例子中使用的是TextInputFormat,他提供的RecordReder会将文本的一行的行号作为key,这一行的文本作为value。这就是自定义Map的输入是<LongWritable, Text>的原因。

       之后调用Map类进行split,将其写入环形内存中,待其达到阀值时,对其的80%进行排序排序和分组,这都是在Map和Reduce之间完成,那么下面我们来看看这些函数类

一、分区

参考上一篇博客:http://blog.csdn.net/gamer_gyt/article/details/47339755

二、排序

参考博客:http://blog.csdn.net/gamer_gyt/article/details/48025805

按照Key进行排序,其实在每一个Map函数里就已经默认调用了job.setSortComparatorClass(Comparator.class)类进行了排序,但此时只不过对每一个Map函数接受的value(行值)的排序,这里所说的是map和reduce之间的排序,实现的是对所有的key进行排序

三、分组

job.setGroupingComparatorClass(GroupComparator.class);

如果用户想自定义排序方式,首先需要实现两个Comparator并将其按照上面的格式进行配置。每一个Comparator需要继承WritableComparator基类。如下所示:

public static class GroupComparator extends WritableComparator { protected GroupComparator() { super(IntPair.class, true); } @Override public int compare(WritableComparable w1, WritableComparable w2) { IntPair ip1 = (IntPair) w1; IntPair ip2 = (IntPair) w2; return IntPair.compare(ip1.getFirst(), ip2.getFirst()); } }


这一点在二次排序中深有体现:可以参考http://blog.csdn.net/gamer_gyt/article/details/47315405

原文链接:https://yq.aliyun.com/articles/413191
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章