目录      

一、关于Reducer全排序

  1.1、  什么叫全排序

  1.2、  分区的标准是什么

二、全排序的三种方式

  2.1、  一个Reducer

  2.2、  自定义分区函数

  2.3、  采样


  一、关于Reducer全排序  

1.1、什么叫全排序?

在所有的分区(Reducer)中,KEY都是有序的:

  • 正确举例:如Reducer分区1中的key是1、3、4,分区2中的key是5、8、9
  • 错误举例:如Reducer分区1中的key是1、3、4,分区2中的key是、7、9

1.2、数据分区的标准是什么?

默认的分区方式是根据mapper后的key的hash值,除以Reducer的分区数量,取其余数判定;例:

  • 某key的hash值是999,此时有3个分区(Reducer),则999 % 3 = 0;则该key和其对应value会分在第一个区(同理,当余数为1,2时会分在对应的另外两个区)。

注意:若key的类型是Text类(或IntWritable等)的,则计算的是Text类型的key的hash值,而非通过Text获取到的String(或int等)类型的hash值。

也可自定义分区的判定方式,见下2.2、自定义分区函数


  二、全排序的三种方式  

  • 一个Reduce
  • 自定义分区函数
  • 采样

2.1、一个Reduce

只有一个Reduce分区,自然是全排序效果


2.2、自定义分区函数

  1. 创建一个继承Partitioner的类,如:Partition
  2. 重写其”getPartition“方法,作为判断分区的依据
  3. 在main的job中将其加入:job.setPartitionerClass(Partition.class);

以随机分区为例,伪代码如下:

 public class Partition extends Partitioner <Text,IntWritable>{

     @Override
public int getPartition(Text text, IntWritable intWritable, int numPartitions) {
Random r = new Random();
//根据分区的数量(numPartitions),获取一个随机值返回,返回的值作为Key判断分区的依据
int i = r.nextInt(numPartitions);
return i;
}
} public class RandomAPP {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
...... //放判断放入分区的方式(随机放入)
job.setPartitionerClass(Partition.class); ...... //等待执行MapperReducer
job.waitForCompletion(true);
}
}

2.3、采样:TotalOrderPartition

  • RandomSampler:随机采样 ,性能差,适合乱序数据
  • IntervalSampler:间隔采样 ,性能较好,适合有序数据
  • SplitSampler:切片采样 ,性能较好,适合有序数据

以随机采样为例,伪代码如下:

注:以下需要放在App中设置配置文件的后面

         //在App中指定分区函数类
job.setPartitionerClass(TotalOrderPartition.class); //设置文件的写入路径
TotalOrderPartition.setPartitionFile(job.getConfiguration(),new Path("E:/par.dat")); /**
* 初始化采样器
* RandomSampler 采用随机采样的方式
* freq 每个Key被选中的概率 freq x key > 分区数
* numSamples 需要的样本数 numSamples > 分区数
* maxSplitsSampled 文件最大切片数 maxSplitsSampled > 当前切片数
*/
InputSampler.RandomSampler = new InputSampler.RandomSampler(freq, numsamples,maxsplitsSampled ); //写入采样数据
InputSampler.writePartitionFile(job,sampler);

    Over    

 

hadoop排序 -- 全排序的更多相关文章

  1. Hadoop学习笔记: 全排序

    在Hadoop中实现全排序有如下三种方法: 1. 只使用一个reducer 2. 自定义partitioner 3. 使用TotalOrderPartitioner 其中第一种方法显然违背了mapre ...

  2. Hadoop的partitioner、全排序

    按数值排序 示例:按气温字段对天气数据集排序问题:不能将气温视为Text对象并以字典顺序排序正统做法:用顺序文件存储数据,其IntWritable键代表气温,其Text值就是数据行常用简单做法:首先, ...

  3. MapReduce --全排序

    MapReduce全排序的方法1: 每个map任务对自己的输入数据进行排序,但是无法做到全局排序,需要将数据传递到reduce,然后通过reduce进行一次总的排序,但是这样做的要求是只能有一个red ...

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

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

  5. Hadoop之WritableComprale 排序

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

  6. [大数据相关] Hive中的全排序:order by,sort by, distribute by

    写mapreduce程序时,如果reduce个数>1,想要实现全排序需要控制好map的输出,详见Hadoop简单实现全排序. 现在学了hive,写sql大家都很熟悉,如果一个order by解决 ...

  7. Hadoop中的排序和连接

    MapReduce的全排序 主要是为了保证分区排序,即第一个分区的最后一个Key值小于第二个分区的第一个Key值 与普通的排序仅仅多一个自定义分区类MyPartitioner见自己所写的实验 (设置一 ...

  8. hive中的全排序

    写mapreduce程序时,如果reduce个数>1,想要实现全排序需要控制好map的输出 现在学了Hive,写sql大家都很熟悉,如果一个order by解决了全排序还用那么麻烦写mapred ...

  9. C#字符串全排序

    排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列: 全排列:当n==m时,称为全排列: 比如:集合{ 1,2,3}的全排列为: { 1 2 3} { 1 3 2 } { 2 1 3 ...

随机推荐

  1. HTML5新增的标签和属性归纳

    收集总结的HTML5的新特性,基本除了IE9以下都可以使用. HTML5语法 大部分延续了html的语法 不同之处:开头的 <!DOCTYPE html> <html lang=&q ...

  2. windows 下 gdb 的安装

    在 windows 下 gcc/g++ 的安装 这篇文章中已经提到,用MinGW Installation Manager可以方便地管理 MinGW 组件,因此使用该软件安装 gdb . 打开 Min ...

  3. 9、django

    django是一款功能强大的web框架 自带admin后台管理.session.ORM.form验证功能.用户auth验证.模板引擎.simple tag.过滤器 Django RESTful fra ...

  4. 关于CSS中的元素定位

    ---恢复内容开始--- CSS 定位和浮动 CSS 为定位和浮动提供了一些属性,利用这些属性,可以建立列式布局,将布局的一部分与另一部分重叠,还可以完成多年来通常需要使用多个表格才能完成的任务. 定 ...

  5. January 06 2017 Week 1st Friday

    Victory won't come to me unless I go to it. 胜利是不会向我走来的,我必须自己走向胜利. I wish I can walk from one victory ...

  6. [COGS 2066]七十和十七

    2066. 七十和十七 ★★★   输入文件:xvii.in   输出文件:xvii.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 七十君最近爱上了排序算法,于是Ta ...

  7. scala当中的类

    1.类的定义与创建 创建一个scala class来定义我们的一个类.类当中可以定义各种属性或者方法,或者函数都可以     class Person {       //定义一个属性,叫做name的 ...

  8. Java Basic Notes——static修饰符

    1.static 在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只要程序在运行,那么这块内存就 ...

  9. 记录智能指针使用shared_ptr使用错误

    shared_ptr为智能指针,今天一次在使用shared_ptr时,错误的将其初始化方式写为shared_ptr<T> test = shared_ptr<T>(),随后导致 ...

  10. IDEA 常用插件收藏

    1.maven helper 查看maven依赖,解决jar包冲突. 2.Alibaba Java Coding Guidelines  代码风格遵循阿里java规范. 3.Lombok 简化实体中的 ...