在学习MapReduce编程模型接口的五个组件之前,我们先来看一下MapReduce的序列化。
那么什么是序列化呢?
序列化就是讲一个对象编码成一个字节流;相反,从字节流中重新构建对象就叫做反序列化。序列化主要有三种用途:
●持久化:将内存中的对象经序列化后保存到磁盘上;
●作为通信的数据传输格式:将一个机器上的内存中的对象经序列化后传输到其他机器上,或在相同机器上的不同进程之间的数据通信;
●作为copy、clone机制:将对象序列化到内存中,然后通过反序列化,可以得到一个已存在的对象的copy。
在分布式系统中,主要使用序列化的前两种功能,数据持久化和通信数字格式。
MapReduce为什么要专门再开发出自己的序列化(Writable),而不用java原有的序列化(Serializable)?在本节中我们将会找到答案。
我们先来看一下Java内置的序列化机制,该序列化机制非常简单,只需要将要序列化的对象的类继承java.io.Serializable接口就行了。java.io.Serializable只是一个标志性的接口,不具有任何成员函数:
public interface Serializable {
}
Java的序列化机制非常“聪明”,它会将要序列化的对象的类、类签名、类的所有非暂态和非晶态成员变量的值,以及其所有的父类都要序列化。同时,它还会跟踪要序列化的对象所有可以达到的其他对象内部数据,并描述所有这些对象是如何被链接起来的,即使非常复杂的情况如循环引用的对象,序列化也不会陷入死循环。但是,经Java内置的序列化后的数据的大小太庞大了,不但包括用户想要保存的数据,还包括大量的类相关的附加数据信息,这对需要保存和处理的大规模数据的Hadoop来说,很不合适。另外还有一点,Java的序列化机制不能复用反序列化后的对象。
对于Hadoop,其序列化机制需要有如下的特征:
●紧凑:在Hadoop中,带宽是最稀缺的资源,一个紧凑的序列化机制可以充分利用数据中心的带宽;
●快速(性能):在进程间通信会大量使用序列化机制,因此需要尽量减少序列化合反序列化的开销;
●可扩展:随着系统发展,系统间通信的协议可能会升级,累的定义也可能会发生改变,序列化机制需要这些升级和变化;
●互操作:可以支持不同开发语言间的通信。
Java内置的序列化机制虽然简单而强大,但是却并不符合上述的要求。但是Hadoop平台中新的序列化机制,就完全符合上述要求吗,答案是否定的,它只符合紧凑和快速的要求,但是缺不符合可扩展和互操作的要求。
为了支持以上特性,Hadoop引入了org.apache.hadoop.io.Writable接口。Writable机制满足了紧凑和快速的这两个特性,Writable接口不是一个说明性的标志接口,声明如下:
public interface Writable{
/**
* 反序列化操作,从流中读数据,为了效率,尽量复用现有对象
* @param input DataInput流,从该流中读取数据
* @Throws IOException
*/
@Override
public void readFields(DataInput input) throws IOException {
//TODO
}
/**
* 序列化操作,将对象输出到流中
* @param output DataOutput流,序列化后的结果
* @Throws IOException
*/
@Override
public void write(DataOutput output) throws IOException {
//TODO
}
}
Writable的使用示例代码:
public class ModeEntry implements Writable{
private long key;
private long value;
public ModeEntry(long key,long value){
this.key = key;
this.value = value;
}
/**
* 反序列化操作,从流中读数据,为了效率,尽量复用现有对象
* @param input DataInput流,从该流中读取数据
* @throws IOException
*/
@Override
public void readFields(DataInput input) throws IOException {
this.key = input.readLong();
this.value = input.readLong();
}
/**
* 序列化操作,将对象输出到流中
* @param output DataOutput流,序列化后的结果
* @throws IOException
*/
@Override
public void write(DataOutput output) throws IOException {
output.writeLong(this.key);
output.writeLong(this.value);
}
}
总的来说,Hadoop的序列化机制的特点是紧凑、高效和可复用反序列化后的对象。另外相比Java内建的序列化机制,序列化后的数据比较少,不会附加大量的类信息和其应用对象及对象的链接信息,在序列化和反序列化的开销上,Hadoop的序列化机制要较Java内建的序列化机制开销要少很多。
分享到:
相关推荐
MapReduce编程模型3.1 MapReduce编程模型概述3.1.1 MapReduce编程接口体系结构3.1.2 新旧MapReduce API比较3.2 MapReduce API基本概念3.2.1 序列化3.2.2 Reporter参数3.2.3 回调机制3.3 Java API解析3.3.1 ...
Hadoop 3.x(MapReduce)----【Hadoop 序列化】---- 代码 Hadoop 3.x(MapReduce)----【Hadoop 序列化】---- 代码 Hadoop 3.x(MapReduce)----【Hadoop 序列化】---- 代码 Hadoop 3.x(MapReduce)----【Hadoop ...
尚硅谷大数据技术之Hadoop(MapReduce)(作者:尚硅谷大数据研发部)版本:V2.0第1章 MapReduce概述1.1 MapReduce定义1.2
·熟悉hadoop的数据和ilo构件,用于压缩、数据集成、序列化和持久处理 ·洞悉编~mapreduce实际应用时的常见陷阱和高级特性 ·设计、构建和管理一个专用的hadoop集群或在云上运行hadoop ·使用高级查询语言...
·熟悉Hadoop的数据和IlO构件,用于压缩、数据集成、序列化和持久处理 ·洞悉编~MapReduce实际应用时的常见陷阱和高级特性 ·设计、构建和管理一个专用的Hadoop集群或在云上运行Hadoop ·使用高级查询语言Pig来处理...
2.1 序列化概述 2.2 常用数据序列化类型 2.3 自定义 bean 对象实现序列化接口(Writable) 2.4 序列化案例实操
大数据与云计算教程课件 优质大数据课程 09.MapReduce序列化(共29页).pptx 大数据与云计算教程课件 优质大数据课程 10.MapReduce MP过程进阶(共42页).pptx 大数据与云计算教程课件 优质大数据课程 11.MapReduce ...
09.MapReduce序列化 10.MapReduce MP过程进阶 11.MapReduce IO操作 12.序列化框架 13.深入MapReduce应用开发 14.Hadoop集群配置 15.Hive 16.Hive操作 17.Hive查询 18.HBase 19.Pig 20.Pig Latin 21.Pig模式与函数 22...
09.MapReduce序列化 10.MapReduce MP过程进阶 11.MapReduce IO操作 12.序列化框架 13.深入MapReduce应用开发 14.Hadoop集群配置 15.Hive 16.Hive操作 17.Hive查询 18.HBase 19.Pig 20.Pig Latin 21.Pig模式与函数 22...
09.MapReduce序列化 10.MapReduce MP过程进阶 11.MapReduce IO操作 12.序列化框架 13.深入MapReduce应用开发 14.Hadoop集群配置 15.Hive 16.Hive操作 17.Hive查询 18.HBase 19.Pig 20.Pig Latin 21.Pig模式与函数 22...
09.MapReduce序列化 10.MapReduce MP过程进阶 11.MapReduce IO操作 12.序列化框架 13.深入MapReduce应用开发 14.Hadoop集群配置 15.Hive 16.Hive操作 17.Hive查询 18.HBase 19.Pig 20.Pig Latin 21.Pig模式与函数 22...
·熟悉hadoop的数据和ilo构件,用于压缩、数据集成、序列化和持久处理 ·洞悉编~mapreduce实际应用时的常见陷阱和高级特性 ·设计、构建和管理一个专用的hadoop集群或在云上运行hadoop ·使用高级查询...
延迟反序列化:一种提升MapReduce程序性能的方法,黄佳,,基于Hadoop提供的MapReduce并行计算框架,用户可以方便地实现并行计算。通常,用户在MapReduce程序中将输入数据解析成为由特定分隔符分隔
当自定义一个类之后,如果想要产生的对象在hadoop中进行传输,那么需要 这个类实现Writable的接口进行序列化/反序列化 案例:统计每个人产生的总流量 数据源 自定义类序列化 import java.io.DataInput; import java...
Hadoop 培训课程(3)MapReduce_1 MapReduce原理*** MapReduce执行过程** ...Writable接口与序列化机制*** ---------------------------加深拓展---------------------- MapReduce的执行过程源码分析
hadoop Common – 是hadoop的核心,包括文件系统、远程调用RPC的序列化函数。 HDSF : 提供高吞吐量的可靠分布式文件系统是 GFS的开源实现。 •Hadoop的文件系统。必须通过hadoop fs 命令来读取。支持分布式。 ...
Hadoop是 apache 的开源 项目,开发的主要目的是为了构建可靠,可拓展 scalable ,分布式的系 统, hadoop 是一系列的子工程的 总和,其中...4. 其他工程包含: Avro( 序列化系 统 ) , Cassandra( 数据 库项目 ) 等
16、MapReduce的基本用法示例-自定义序列化、排序、分区、分组和topN 网址:https://blog.csdn.net/chenwewi520feng/article/details/130454036 本文介绍MapReduce常见的基本用法。 前提是hadoop环境可正常运行。 ...
02-hadoop中的序列化机制.avi 03-流量求和mr程序开发.avi 04-hadoop的自定义排序实现.avi 05-mr程序中自定义分组的实现.avi 06-shuffle机制.avi 07-mr程序的组件全貌.avi 08-textinputformat对切片规划的源码...