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 排序的更多相关文章

  1. 2 weekend110的hadoop的自定义排序实现 + mr程序中自定义分组的实现

    我想得到按流量来排序,而且还是倒序,怎么达到实现呢? 达到下面这种效果, 默认是根据key来排, 我想根据value里的某个排, 解决思路:将value里的某个,放到key里去,然后来排 下面,开始w ...

  2. Hadoop日记Day18---MapReduce排序分组

    本节所用到的数据下载地址为:http://pan.baidu.com/s/1bnfELmZ MapReduce的排序分组任务与要求 我们知道排序分组是MapReduce中Mapper端的第四步,其中分 ...

  3. Hadoop shuffle与排序

    Mapreduce为了确保每个reducer的输入都按键排序.系统执行排序的过程-----将map的输出作为输入传给reducer 称为shuffle.学习shuffle是如何工作的有助于我们理解ma ...

  4. 三种方法实现Hadoop(MapReduce)全局排序(1)

    我们可能会有些需求要求MapReduce的输出全局有序,这里说的有序是指Key全局有序.但是我们知道,MapReduce默认只是保证同一个分区内的Key是有序的,但是不保证全局有序.基于此,本文提供三 ...

  5. hadoop streaming字段排序介绍

    我们在使用hadoop streaming的时候默认streaming的map和reduce的separator不指定的话,map和reduce会根据它们默认的分隔符来进行排序 map.reduce: ...

  6. 一起学Hadoop——二次排序算法的实现

    二次排序,从字面上可以理解为在对key排序的基础上对key所对应的值value排序,也叫辅助排序.一般情况下,MapReduce框架只对key排序,而不对key所对应的值排序,因此value的排序经常 ...

  7. Hadoop mapreduce自定义排序WritableComparable

    本文发表于本人博客. 今天继续写练习题,上次对分区稍微理解了一下,那根据那个步骤分区.排序.分组.规约来的话,今天应该是要写个排序有关的例子了,那好现在就开始! 说到排序我们可以查看下hadoop源码 ...

  8. hadoop MapReduce辅助排序解析

    1.数据样本,w1.csv到w5.csv,每个文件数据样本2000条,第一列是年份从1990到2000随机,第二列数据从1-100随机,本例辅助排序目标是找出每年最大值,实际上结果每年最大就是100, ...

  9. hadoop复合键排序使用方法

    在hadoop中处理复杂业务时,需要用到复合键,复合不同于单纯的继承Writable接口,而是继承了 WritableComparable<T>接口,而实际上,WritableCompar ...

随机推荐

  1. Setting up multi nodes live migration in Openstack Juno with devstack

    Setting up multi nodes live migration in Openstack Juno with devstack Summary Live migration overvie ...

  2. MinGW和MSYS区别和关系以及MinGW&MSYS在Win7中安装并编译x264

    http://blog.csdn.net/freeape/article/details/50555003

  3. FMX有两种消息处理的实现方式,一种是用TMessageManager来实现自定义的消息,另外一种象TEdit中的实现,直接声明消息方法(firemonkey messaging)

    看FMX代码,发现有两种消息处理的实现方式,一种是用TMessageManager来实现自定义的消息,另外一种象TEdit中的实现,直接声明消息方法.   早前,看过文章说TMessageManage ...

  4. 配置QSslConfiguration让客户端程序跳过本地SSL验证

    大家下午好哦.今天我们在重新制作我们萌梦聊天室的时候,出现了这样的问题.那就是我们的客户端能够对qtdream.com服务器进行登录,但是不能对localhost服务器(也就是本机啦)进行登录.这究竟 ...

  5. Microsoft.Ace.OleDb.12.0 操作excel

    在用c#操作excel的时候,碰到了一下的问题: 1.Microsoft.Ace.OleDb.12.0未安装,可以到下载2007 Office system 驱动程序AccessDatabaseEng ...

  6. 使用 acl_cpp 的 HttpServlet 类及服务器框架编写WEB服务器程序(系列文章)

    在 <用C++实现类似于JAVA HttpServlet 的编程接口 > 文章中讲了如何用 HttpServlet 等相关类编写 CGI 程序,于是有网友提出了 CGI 程序低效性,不错, ...

  7. linux 磁盘控件找到大文件

    df -lh Used:已经使用的空间 Avail:可以使用的空间 Mounted on:挂载的目录 然后找到大文件 du是linux下用看查看磁盘的命令 下面我们先一个目录的来查看空间占用情况 du ...

  8. 01 Django基础

    目录 一.什么是web框架? 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. 对 ...

  9. Storm 学习之路(二)—— Storm核心概念详解

    一.Storm核心概念 1.1 Topologies(拓扑) 一个完整的Storm流处理程序被称为Storm topology(拓扑).它是一个是由Spouts 和Bolts通过Stream连接起来的 ...

  10. iOS开发(5):设备唯一标识与全局变量

    这里记录两个iOS开发中经常用到的知识点,一个是唯一标识,一个是全局变量. (1)唯一标识 唯一标识一台设备(比如iPhone.iPad等)是一个基本的实现与业务上的需求,因为这个唯一标识在许多场景都 ...