首页 技术 正文
技术 2022年11月18日
0 收藏 880 点赞 2,181 浏览 2046 个字

Hadoop之WritableComprale 排序

Hadoop只对key进行排序

排序是 MapReduce 框架中最重要的操作之一。Map Task 和 Reduce Task 均会对数据(按照 key)进行排序。

该操作属于 Hadoop 的默认行为。任何应用程序中的数据均会被排序,而不管逻辑上是否需要。

默认排序是按照字典顺序排序,且实现该排序的方法是快速排序。对于 Map Task,它会将处理的结果暂时放到一个缓冲区

中,当缓冲区使用率达到一定阈值后,再对缓冲区中的数据进行一次排序,并将这些有序数据写到磁盘上,而当数据处理完毕

后,它会对磁盘上所有文件进行一次合并,以将这些文件合并成一个大的有序文件。对于 Reduce Task,它从每个 Map Task

上远程拷贝相应的数据文件,如果文件大小超过一定阈值,则放到磁盘上,否则放到内存中。如果磁盘上文件数目达到一定阈

值,则进行一次合并以生成一个更大文件;如果内存中文件大小或者数目超过一定阈值,则进行一次合并后将数据写到磁盘

上。当所有数据拷贝完毕后,Reduce Task 统一对内存和磁盘上的所有数据进行一次合并。

部分排序(区内排序)

MapReduce 根据输入记录的键对数据集排序。保证输出的每个文件内部排序。

//实现在每个分区文件内部进行有序输出
//排序的实体类需要实现WritableComparable 重写 compareTo方法
//让实体类作为key 即可

全排序

如何用 Hadoop 产生一个全局排序的文件?最简单的方法是使用一个分区。但该方法在

处理大型文件时效率极低,因为一台机器必须处理所有输出文件,从而完全丧失了

MapReduce 所提供的并行架构。

替代方案:首先创建一系列排好序的文件;其次,串联这些文件;最后,生成一个全局

排序的文件。主要思路是使用一个分区来描述输出的全局排序。例如:可以为上述文件创建

3 个分区,在第一分区中,记录的单词首字母 a-g,第二分区记录单词首字母 h-n, 第三分区

记录单词首字母 o-z。

//排序的实体类需要实现WritableComparable  重写 compareTo方法
public class PhoneDataSortBean implements WritableComparable<PhoneDataSortBean> { private long up;
private long down;
private long sum; @Override
public String toString() {
return up +
"\t" + down +
"\t" + sum;
} public PhoneDataSortBean(long up, long down) {
this.up = up;
this.down = down;
this.sum = up + down;
} public PhoneDataSortBean() {
} public long getUp() {
return up;
} public void setUp(long up) {
this.up = up;
} public long getDown() {
return down;
} public void setDown(long down) {
this.down = down;
} public long getSum() {
return sum;
} public void setSum(long sum) {
this.sum = sum;
} @Override
public int compareTo(PhoneDataSortBean o) {
//按照总流量排序
return (int) (o.sum - this.sum);
} @Override
public void write(DataOutput dataOutput) throws IOException {
dataOutput.writeLong(this.down);
dataOutput.writeLong(this.up);
dataOutput.writeLong(this.sum);
} @Override
public void readFields(DataInput dataInput) throws IOException {
this.down = dataInput.readLong();
this.up = dataInput.readLong();
this.sum = dataInput.readLong();
}
}

辅助排序:(GroupingComparator 分组)

Mapreduce 框架在记录到达 reducer 之前按键对记录排序,但键所对应的值并没有被排

序。甚至在不同的执行轮次中,这些值的排序也不固定,因为它们来自不同的 map 任务且

这些 map 任务在不同轮次中完成时间各不相同。一般来说,大多数 MapReduce 程序会避免

让 reduce 函数依赖于值的排序。但是,有时也需要通过特定的方法对键进行排序和分组等

以实现对值的排序。

二次排序

在自定义排序过程中,如果 compareTo 中的判断条件为两个即为二次排序。

本博客仅为博主学习总结,感谢各大网络平台的资料。蟹蟹!!

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,088
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,564
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,412
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,185
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,822
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,905