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. Hadoop分布式文件系统

    在一个经典的数据架构中,Hadoop是处理复杂数据流的核心.数据从各种系统中收集而来,并汇总导入到Hadoop分布式文件系统HDFS中,然后通过MapReduce或者其它基于MapReduce封装的语 ...

  2. File handling in Delphi Object Pascal(处理record类型)

    With new users purchasing Delphi every single day, it’s not uncommon for me to meet users that are n ...

  3. 核心思想:自由职业的所谓自由,必须先职业,然后才能自由(还要对抗自己的惰性,提前寻找客户)good

    除了前面提到的专业性,还要足够自律,能够管理好自己的时间和精力. 具体来说,需要目标管理和时间(精力)管理. 所谓目标管理,对于自由职业者来讲,就是要识别出自己最擅长的方向,确立自己可以提供的最有价值 ...

  4. 海康威视频监控设备Web查看系统(三):Web篇

    声明:本系列文章只提供交流与学习使用.文章中所有涉及到海康威视设备的SDK均可在海康威视官方网站下载得到.文章中所有除官方SDK以为的代码均可随意使用,任何涉及到海康威视公司利益的非正常使用由使用者自 ...

  5. Java集合 ArrayList原理及使用

    ArrayList是集合的一种实现,实现了接口List,List接口继承了Collection接口.Collection是所有集合类的父类.ArrayList使用非常广泛,不论是数据库表查询,exce ...

  6. DNS查询命令

    dig(domain information groper)是一个在类Unix命令行模式下查询DNS,包括NS记录,A记录,MX记录等相关信息的工具 一.简单介绍使用dig命令查询DNS的方法 dig ...

  7. Netty源码分析--NIO(一)

    好久没写博客了,最近打算花些时间把Netty的源码好好读一读,下面是本人在学习的过程中的一些笔记,不能确保自己思考的完全是正确的,如果有错误,欢迎大家指正. 由于本人的语文功底烂的很,通篇使用大白话来 ...

  8. 10 jQuery的事件绑定和解绑

    1.绑定事件 语法: bind(type,data,fn) 描述:为每一个匹配元素的特定事件(像click)绑定一个事件处理器函数. 参数解释: type (String) : 事件类型 data ( ...

  9. Python的魔术方法详解

    构造和初始化 __init__我们很熟悉了,它在对象初始化的时候调用,我们一般将它理解为"构造函数". 实际上, 当我们调用x = SomeClass()的时候调用,__init_ ...

  10. mini木马c源码

    #pragma comment(lib, "ws2_32.lib") #pragma comment(linker,"/subsystem:\"windows\ ...