序列化(serialization)是指将结构化的对象转化为字节流,以便在网络上传输或者写入到硬盘进行永久存储;相对的反序列化(deserialization)是指将字节流转回到结构化对象的过程。
在分布式系统中进程将对象序列化为字节流,通过网络传输到另一进程,另一进程接收到字节流,通过反序列化转回到结构化对象,以达到进程间通信。在 Hadoop 中,Mapper,Combiner,Reducer 等阶段之间的通信都需要使用序列化与反序列化技术。举例来说,Mapper 产生的中间结果(
)需要写入到本地硬盘,这是序列化过程(将结构化对象转化为字节流,并写入硬盘),而 Reducer 阶段读取 Mapper 的中间结果的过程则是一个反序列化过程(读取硬盘上存储的字节流文件,并转回为结构化对象),需要注意的是,能够在网络上传输的只能是字节流,Mapper 的中间结果在不同主机间洗牌时,对象将经历序列化和反序列化两个过程。
- <key: value1, value2...>
序列化是 Hadoop 核心的一部分,在 Hadoop 中,位于 org.apache.hadoop.io 包中的 Writable 接口是 Hadoop 序列化格式的实现。
Hadoop Writable 接口是基于 DataInput 和 DataOutput 实现的序列化协议,紧凑(高效使用存储空间),快速(读写数据、序列化与反序列化的开销小)。Hadoop 中的键(key)和值(value)必须是实现了 Writable 接口的对象(键还必须实现 WritableComparable,以便进行排序)。
以下是 Hadoop(使用的是 Hadoop 1.1.2)中 Writable 接口的声明:
|
|
Hadoop 自身提供了多种具体的 Writable 类,包含了常见的 Java 基本类型(boolean、byte、short、int、float、long 和 double 等)和集合类型(BytesWritable、ArrayWritable 和 MapWritable 等)。这些类型都位于 org.apache.hadoop.io 包中。
来源: http://www.bubuko.com/infodetail-2154586.html