在学习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内建的序列化机制开销要少很多。
分享到:
相关推荐
Hadoop 序列化的方法包括 Java 序列化和 Hadoop 序列化。Hadoop 序列化具有更高的效率和更好的可扩展性。 MapReduce 是 Hadoop 家族中的核心组件之一,具有非常高的分布式计算能力和可扩展性。MapReduce 的核心思想...
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)1】深入解析MapReduce MapReduce是Google提出的一种用于处理和生成大规模数据集的编程模型,被广泛应用于大数据处理领域。Hadoop将其作为核心组件,实现了分布式计算的功能...
Hadoop序列化: 1. 为什么要序列化?序列化可以存储活的对象,可以将活的对象发送到远程计算机。 2. 什么是序列化?序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储(持久化)和网络...
标题中的“Hadoop序列化机制”是指Hadoop生态系统中用于数据传输和存储的数据表示方式,它是Hadoop MapReduce和Hadoop Distributed File System (HDFS)等组件之间交换数据的关键技术。序列化是将对象转化为可存储或...
序列化数据是Hadoop进行网络传输时使用的格式,而开发者通常在map和reduce函数中处理的是反序列化后的数据,即Java对象。 4. MapReduce优化技巧:在MapReduce的实践中,优化技巧包括但不限于合理设置map和reduce...
Hadoop提供了一系列的Writable接口实现,用于不同数据类型的序列化和反序列化,如BooleanWritable、IntWritable等。 **1.7 编程规范** 用户需要编写Mapper、Reducer和Driver三个部分。Mapper处理输入数据,Reducer...
本篇文章将深入探讨Hadoop的序列化机制,以及如何自定义Bean对象实现序列化接口。 **2.1 序列化概述** 序列化是将内存中的对象转化为可存储或可传输的数据格式的过程,而反序列化则是相反的操作,将这些数据恢复为...
此外,文档还可能讨论Hadoop生态系统中的其他组件,如HDFS(Hadoop分布式文件系统)、YARN(另一种资源协调器)、HBase(NoSQL数据库)、ZooKeeper(协调服务)、Avro(数据序列化系统)等,因为MapReduce往往与其他...
- **输入格式**:通常以 `, value>` 键值对的形式输入,其中 key 和 value 的具体类型可以根据应用场景选择,但必须实现 `Writable` 接口以支持序列化。 - **输出格式**:MapReduce 作业的输出同样是 `, value>` ...
Hadoop提供了多种内置的可序列化类型,如BooleanWritable、IntWritable、Text等,用于在MapReduce中传输和存储数据。 【MapReduce 编程规范】 用户编写MapReduce程序通常包括三部分: 1. **Mapper**:实现Map函数...
在Hadoop MapReduce作业中,`FlowBean`作为键值对的键或值,会被序列化和反序列化多次。序列化机制的紧凑性、快速性和可扩展性确保了高效的数据处理。Hadoop的序列化机制还允许不同语言之间进行交互,这意味着即使...
8. **protobuf.jar**和**guava.jar**:这两个是Google的库,分别用于数据序列化和提供通用的Java实用工具。 9. **slf4j-api.jar**和相应的实现库(如log4j.jar):简单日志门面(SLF4J)用于日志记录,选择合适的...
- **示例代码**:以下是一个简单的`MyWritable`类实现`Writable`接口的例子,用于演示如何实现序列化与反序列化: ```java public class MyWritable implements Writable { // Some data private int counter; ...
\n\n一、MapReduce序列化\n\nMapReduce是Hadoop生态系统中的核心组件,用于大规模数据处理。序列化在MapReduce中扮演着关键角色,它是数据在分布式环境间传输的基础。序列化是将对象转化为字节流的过程,而反序列化...
- 其他可能的依赖库,如Avro、Protocol Buffers、Guava等,这些库为数据序列化和通用工具提供了支持。 5. **构建路径**:将这些jar包添加到项目的构建路径中。右键点击项目,选择“属性”,然后进入“Java构建路径...
·熟悉Hadoop的数据和IlO构件,用于压缩、数据集成、序列化和持久处理 ·洞悉编~MapReduce实际应用时的常见陷阱和高级特性 ·设计、构建和管理一个专用的Hadoop集群或在云上运行Hadoop ·使用高级查询语言Pig来处理...