hadoop排序 -- 全排序
目录
一、关于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、自定义分区函数
- 创建一个继承Partitioner的类,如:Partition
- 重写其”getPartition“方法,作为判断分区的依据
- 在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排序 -- 全排序的更多相关文章
- Hadoop学习笔记: 全排序
在Hadoop中实现全排序有如下三种方法: 1. 只使用一个reducer 2. 自定义partitioner 3. 使用TotalOrderPartitioner 其中第一种方法显然违背了mapre ...
- Hadoop的partitioner、全排序
按数值排序 示例:按气温字段对天气数据集排序问题:不能将气温视为Text对象并以字典顺序排序正统做法:用顺序文件存储数据,其IntWritable键代表气温,其Text值就是数据行常用简单做法:首先, ...
- MapReduce --全排序
MapReduce全排序的方法1: 每个map任务对自己的输入数据进行排序,但是无法做到全局排序,需要将数据传递到reduce,然后通过reduce进行一次总的排序,但是这样做的要求是只能有一个red ...
- 2 weekend110的hadoop的自定义排序实现 + mr程序中自定义分组的实现
我想得到按流量来排序,而且还是倒序,怎么达到实现呢? 达到下面这种效果, 默认是根据key来排, 我想根据value里的某个排, 解决思路:将value里的某个,放到key里去,然后来排 下面,开始w ...
- Hadoop之WritableComprale 排序
Hadoop之WritableComprale 排序 Hadoop只对key进行排序 排序是 MapReduce 框架中最重要的操作之一.Map Task 和 Reduce Task 均会对数据(按照 ...
- [大数据相关] Hive中的全排序:order by,sort by, distribute by
写mapreduce程序时,如果reduce个数>1,想要实现全排序需要控制好map的输出,详见Hadoop简单实现全排序. 现在学了hive,写sql大家都很熟悉,如果一个order by解决 ...
- Hadoop中的排序和连接
MapReduce的全排序 主要是为了保证分区排序,即第一个分区的最后一个Key值小于第二个分区的第一个Key值 与普通的排序仅仅多一个自定义分区类MyPartitioner见自己所写的实验 (设置一 ...
- hive中的全排序
写mapreduce程序时,如果reduce个数>1,想要实现全排序需要控制好map的输出 现在学了Hive,写sql大家都很熟悉,如果一个order by解决了全排序还用那么麻烦写mapred ...
- C#字符串全排序
排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列: 全排列:当n==m时,称为全排列: 比如:集合{ 1,2,3}的全排列为: { 1 2 3} { 1 3 2 } { 2 1 3 ...
随机推荐
- Linux下top命令监控性能状态
1.性能分析因素:CPU.内存.网络.磁盘读写 2.系统对应的应用类型主要分为以下两种: IO Bound:一般都是高负荷的内存使用以及存储系统,IO范畴的应用就是一个大数据处理的过程:通常数据库软件 ...
- 使用HVTableView动态展开tableView中的cell
使用HVTableView动态展开tableView中的cell 效果: 源码: HVTableView.h 与 HVTableView.m // // HVTableView.h // HRVTab ...
- Python学习---函数的学习1209[all]
1.基础函数 2.高阶函数 3.递归函数 4.内置函数 5.匿名函数和闭包
- Java学习---TCP Socket的学习
基础知识 1. TCP协议 TCP是一种面向连接的.可靠的.基于字节流的运输层(Transport layer)通信协议.在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,UDP是同一层 ...
- CSS学习---css基础知识0105
CSS, Cascading Style Sheets的简称,中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离. 举例:颜色,大小,高度.宽度.内外边距.边框.浮动.定位.字 ...
- visual studio 2017安装教程以及各类问题解决方案
文章的关键词和所含教程: VS2017安装/visual studio 2017安装/Xamarin/Android for visual studio 2017/VS2017找不到网站/VS2017 ...
- 数据链路层 点对点协议 PPP
点对点协议 PPP 一. PPP 协议应满足的需求 简单.提供不可靠的数据报服务,比IP协议简单,不需要纠错,不需要序号,不需要流量控制. 工作方式:接收方每收到一个帧就进行CRC校验,如正确就接受该 ...
- 当有多个相同的DIV时,我怎么判断我点击的是哪个嘞
链接:https://segmentfault.com/a/1190000003480973?utm_source=tuicool&utm_medium=referral 序言 这是我曾经面试 ...
- form表单提交行为
项目中有一个表单如下图,当我填完数据源名称这个input后,点击回车键本意是想跳到下一个input处,然而呢却触发了下面的添加这个按钮的事件,这是怎么回事呢,明明添加这个按钮并没有设置type=&qu ...
- Guava包学习-Multimap
它和上一章的MultiSet的继承结果很相似,只不过在上层的接口是Multimap不是Multiset. Multimap的特点其实就是可以包含有几个重复Key的value,你可以put进入多个不同v ...