Hadoop之WritableComprale 排序
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 中的判断条件为两个即为二次排序。
本博客仅为博主学习总结,感谢各大网络平台的资料。蟹蟹!!
Hadoop之WritableComprale 排序的更多相关文章
- 2 weekend110的hadoop的自定义排序实现 + mr程序中自定义分组的实现
我想得到按流量来排序,而且还是倒序,怎么达到实现呢? 达到下面这种效果, 默认是根据key来排, 我想根据value里的某个排, 解决思路:将value里的某个,放到key里去,然后来排 下面,开始w ...
- Hadoop日记Day18---MapReduce排序分组
本节所用到的数据下载地址为:http://pan.baidu.com/s/1bnfELmZ MapReduce的排序分组任务与要求 我们知道排序分组是MapReduce中Mapper端的第四步,其中分 ...
- Hadoop shuffle与排序
Mapreduce为了确保每个reducer的输入都按键排序.系统执行排序的过程-----将map的输出作为输入传给reducer 称为shuffle.学习shuffle是如何工作的有助于我们理解ma ...
- 三种方法实现Hadoop(MapReduce)全局排序(1)
我们可能会有些需求要求MapReduce的输出全局有序,这里说的有序是指Key全局有序.但是我们知道,MapReduce默认只是保证同一个分区内的Key是有序的,但是不保证全局有序.基于此,本文提供三 ...
- hadoop streaming字段排序介绍
我们在使用hadoop streaming的时候默认streaming的map和reduce的separator不指定的话,map和reduce会根据它们默认的分隔符来进行排序 map.reduce: ...
- 一起学Hadoop——二次排序算法的实现
二次排序,从字面上可以理解为在对key排序的基础上对key所对应的值value排序,也叫辅助排序.一般情况下,MapReduce框架只对key排序,而不对key所对应的值排序,因此value的排序经常 ...
- Hadoop mapreduce自定义排序WritableComparable
本文发表于本人博客. 今天继续写练习题,上次对分区稍微理解了一下,那根据那个步骤分区.排序.分组.规约来的话,今天应该是要写个排序有关的例子了,那好现在就开始! 说到排序我们可以查看下hadoop源码 ...
- hadoop MapReduce辅助排序解析
1.数据样本,w1.csv到w5.csv,每个文件数据样本2000条,第一列是年份从1990到2000随机,第二列数据从1-100随机,本例辅助排序目标是找出每年最大值,实际上结果每年最大就是100, ...
- hadoop复合键排序使用方法
在hadoop中处理复杂业务时,需要用到复合键,复合不同于单纯的继承Writable接口,而是继承了 WritableComparable<T>接口,而实际上,WritableCompar ...
随机推荐
- Nginx反向代理负载均衡的容器化部署
首先,在home目录创建microservices目录,开启第一篇章. cd ~ && mkdir microservices && cd microservices ...
- Zookeeper详解-概述(一)
ZooKeeper是一种分布式协调服务,用于管理大型主机.在分布式环境中协调和管理服务是一个复杂的过程.ZooKeeper通过其简单的架构和API解决了这个问题.ZooKeeper允许开发人员专注于核 ...
- Tomcat常见问题[内存溢出,虚拟目录配置等](一)
一.Tomcat内存溢出的解决方法 内存溢出一般有如下三种常见的原因: OutOfMemoryError: Java heap space OutOfMemoryError: PermGen spac ...
- Redi缓存注意事项
缓存使用的场景 在一个高频访问的应用系统中,每次用户的请求需要去存储中获取数据,会对数据库造成很大的压力.容易导致数据库的奔溃.所以才会出现缓存来分担一部分的数据库的压力. 具体会产生数据库访问压力的 ...
- java源码解析之String类(四)
/* * 返回指定字符第一次出现的字符串内的索引 */ public int indexOf(int ch) { return indexOf(ch, 0); } /* * 返回指定字符第一次出现的字 ...
- Python开发【第七篇】: 面向对象和模块补充
内容概要 特殊成员 反射 configparser模块 hashlib模块 logging模块 异常处理 模块 包 1. 特殊成员 什么是特殊成员呢? __init_()就是个特殊的成员. 带双下划线 ...
- K8s集群部署(四)------ Flannel网络部署
所有节点都要部署Flannel网络,在所有节点操作. 1.为Flannel生成证书 [root@k8s-master ssl]# pwd /usr/local/src/ssl [root@k8s-ma ...
- [apue] 使用 poll 检测管道断开
一般使用 poll 检测 socket 或标准输入时,只要指定 POLLIN 标志位,就可以检测是否有数据到达,或者连接断开: ]; fds[].fd = STDIN_FILENO; fds[].ev ...
- 视图系统CBV 和 response
CBV和FBV FBV(function based view ) CBV(class based view) 1. CBV的定义 # 增加出版社 CBV from django.views imp ...
- (转)Java 8 中的 Streams API 详解
为什么需要 Stream Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念.它也不同于 StAX 对 ...