MapReduce(二) MR的高级特性-序列化、排序、分区、合并
一、序列化
(*) 核心接口:Writable接口。如果有一个类实现了Writable接口,就可以作为Map/Reduce的key和value.
举例:
读取员工数据,生成员工对象,直接存储在HDFS
序列化的顺序和反序列化 的顺序要保持相同。
public void readFields(DataInput input) throws IOException{
}
pubic void write(DataOutput output) throws IOException{
}
二、排序
排序规则:按照key2排序。key2可以是基本数据类型,也可以是对象(可序列化的对象)。
基本数据类型:
ByteWritable:单字节数值
IntWritable:整型数
LongWritable:长整型数
FloatWritable:浮点数
DoubleWritable:双字节数值
BooleanWritable:标准布尔型数值
Text:使用UTF8格式存储的文本
NullWritable:当<key,value>中的key或value为空时使用
常用的数据类型,排序规则的实现:
(*)Int 数字:默认升序,可以改变默认的排序规则,通过创建自己的比较器。
创建一个类(比如叫做NewIntCompare)继承并重写 IntWritable.Comparator 类中的compare方法,
在main函数中,通过Job类对象配置比较器,在Map类设置语句的后面,添加job.setSortComparatorClass(NewIntCompare.class)
(*)字符串:默认字典序,可以改变默认的排序规则,通过创建自己的比较器。
创建一个类(比如叫做NewTextCompare)继承并重写 Text.Comparator类中的compare方法,
在main函数中,通过Job类对象配置比较器,在Map类设置语句的后面,添加job.setSortComparatorClass(NewTextCompare.class)
(*)对象:实现WritableComparable接口
三、分区
1、需求分析:把最终结果中,不同类型的数据,输出到不同的文件。比如,将相同城市的数据输出到一个文件中,或者把相同性别的数据输出的一个文件中。
2、MR中分区的特点:
(1)在MR中,一个reducer任务对应一个输出文件,分区的数量也是reducer任务的数量。
(2)Reducer的输入数据来自于Mapper,分区工作由Mapper任务来完成。
(3)Mapper任务划分数据的过程叫做Partition,MR中负责划分数据的类叫做Partitioner。
(4)自定义分区规则,需要创建新的分区类(以MyPartitioner为自定义类的名字),继承Partitioner,并重写getPartition()方法,代码如下。
1 import org.apache.hadoop.mapreduce.Partitioner
2
3 public void MyPartitioner extends Partitioner<K,V>{
4 @Override
5 // 默认使用key的hash值与Integer的做大值做“与运算”,避免出现溢出的情况
6 public int getPartiton(K key ,V value , int numReduceTasks){
7 return (key.hashCode() && Integer.MAX_VALUE) % numReduceTasks;
8 }
9 }
(5)MyPartitioner类是用于处理Mapper任务的输出的,getPartition方法的三个参数分别是,Mapper输出的key,value,和设置的Reducer任务数量(即,分区数量)。
(6)getPartition方法的返回值为0~numReduceTasks-1 ,分别代表 numReduceTasks个分组;
(7)分区数 numReduceTasks的设置,在主函数中完成,代码如下:
job.setPartitionerClass(Mypartitioner.class);
job.setNumReduceTasks(3); //比如,设置分区数量为3个
四、合并(combiner)
1、hadoop中娥的combiner函数其实本质上也是Reduce,设计的初衷是为了降低Mapper和Reducer之间的 IO的数据量,将Mapper输出的数据在Mapper端进行合并。
2、注意事项:
(1)combiner并不是用于所有的业务场景,比如,求平均数的时候就不能使用。
(2)combiner的输入是Mapper的输出,而输出是Reducer的输入,然后在MapReduce中,Mapper的输出数据类型与Reducer的输入数据类型是相同的。所以在设计Mapper/Reducer
之前要充分考虑,防止因为combiner的出现,对Reducer最终的输出产生影响。
3、在主函数中设置combiner,代码如下
job.setCombinerClass(MyCombiner.class);
MapReduce(二) MR的高级特性-序列化、排序、分区、合并的更多相关文章
- MapReduce编程实战之“高级特性”
本篇介绍MapReduce的一些高级特性,如计数器.数据集的排序和连接.计数器是一种收集作业统计信息的有效手段.排序是MapReduce的核心技术,MapReduce也可以运行大型数据集间的" ...
- 【Redis】二、Redis高级特性
(三) Redis高级特性 前面我们介绍了Redis的五种基本的数据类型,灵活运用这五种数据类型是使用Redis的基础,除此之外,Redis还有一些特性,掌握这些特性能对Redis有进一步的了解, ...
- (二)python高级特性
一.切片 >>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] 对这种经常取指定索引范围的操作,用循环十分繁琐,因此,Python ...
- Zookeeper系列五:Master选举、ZK高级特性:基本模型
一.Master选举 1. master选举原理: 有多个master,每次只能有一个master负责主要的工作,其他的master作为备份,同时对负责工作的master进行监听,一旦负责工作的mas ...
- 【MySQL高级特性】高性能MySQL第七章
2017-07-25 14:15:43 前言:MYSQL从5.0和5.1版本开始引入了很多高级特性,例如分区.触发器等,这对有其他关系型数据库使用 背景的用户来说可能并不陌生.这些新特性吸引了很多用户 ...
- mapreduce二次排序详解
什么是二次排序 待排序的数据具有多个字段,首先对第一个字段排序,再对第一字段相同的行按照第二字段排序,第二次排序不破坏第一次排序的结果,这个过程就称为二次排序. 如何在mapreduce中实现二次排序 ...
- (转)MapReduce二次排序
一.概述 MapReduce框架对处理结果的输出会根据key值进行默认的排序,这个默认排序可以满足一部分需求,但是也是十分有限的.在我们实际的需求当中,往往有要对reduce输出结果进行二次排序的需求 ...
- 详细讲解MapReduce二次排序过程
我在15年处理大数据的时候还都是使用MapReduce, 随着时间的推移, 计算工具的发展, 内存越来越便宜, 计算方式也有了极大的改变. 到现在再做大数据开发的好多同学都是直接使用spark, hi ...
- Hadoop学习笔记: MapReduce二次排序
本文给出一个实现MapReduce二次排序的例子 package SortTest; import java.io.DataInput; import java.io.DataOutput; impo ...
随机推荐
- java三种注释以及参数涵义(转)
原文地址:https://www.cnblogs.com/miys/p/4bf714ce33068dcf9ac6526309c9b5e6.html 单行注释:// 注释内容 多行注释:/*... 注释 ...
- [转载]EXCEL绝对引用中$A$1、A$1、$A1三个的区别?
转自:https://zhidao.baidu.com/question/167695289.html EXCEL绝对引用中$A$1.A$1.$A1三个的区别? 符号“$”加在不地方的含义有何不同? ...
- RFS常见问题
一.DatabaseLibrary 库遇到的问题:1,连接mysql库,查询语句带有中文,报FAIL UnicodeEncodeError: 'latin-1' codec can't encode ...
- java.io.IOException: Attempted read from closed stream
前言: 代码如下,执行的时候提示"java.io.IOException: Attempted read from closed stream." public static JS ...
- 线程demo异常处理
今天写了个线程小demo,出现了异常, 如下: Traceback (most recent call last): File "threading.py", line 1, in ...
- 决策树算法原理(CART分类树)
决策树算法原理(ID3,C4.5) CART回归树 决策树的剪枝 在决策树算法原理(ID3,C4.5)中,提到C4.5的不足,比如模型是用较为复杂的熵来度量,使用了相对较为复杂的多叉树,只能处理分类不 ...
- 如何利用redis来进行分布式集群系统的限流设计
在很多高并发请求的情况下,我们经常需要对系统进行限流,而且需要对应用集群进行全局的限流,那么我们如何类实现呢. 我们可以利用redis的缓存来进行实现,并且结合mysql数据库一起,先来看一个流程图. ...
- @RequestMapping的Ant风格URL
Ant风格资源地址支持3中匹配符 ? 匹配文件名中一个字符. * 匹配 文件名中任意字符 ** 匹配多层路径 例如 /hello/*/myspring 匹配 /hello/abc/mysprin ...
- SpringBoot整合Mybatis注解版---update出现org.apache.ibatis.binding.BindingException: Parameter 'XXX' not found. Available parameters are [arg1, arg0, param1, param2]
SpringBoot整合Mybatis注解版---update时出现的问题 问题描述: 1.sql建表语句 DROP TABLE IF EXISTS `department`; CREATE TABL ...
- for in 中的index
自己学艺不精... 数据是个对象,想要里面的key 原来 for (item, index) in items 中的index 就是key