1.hadoop序列化的必要性

传统的计算机系统通过I/O操作与外界进行交流, Hadoop 的I/O由传统的I/O系统发展而来,但又有些不同, Hadoop 需要处理 P、T 级别的数据,所以在org.apache.hadoop.io包中包含了一些面向海量数据处理的基本输人输出工具。
Mapreduce程序中Map和Reduce的输入输出的key-value都是序列化数据类型。

2.序列化概念

对象的序列化(Serialization)用于将对象编码成一个字节流,以及从字节流中重新构建对象。"将一个对象编码成一个字节流"称为序列化该对象(SeTializing);相反的处理过程称为反序列化(Deserializing)。 序列化有三种主要的用途:

  1. 作为一种持久化格式:一个对象被序列化以后,它的编码可以被存储到磁盘上,供以后反序列化用。
  2. 作为一种通信数据格式:序列化结果可以从一个正在运行的虚拟机,通过网络被传递到另一个虚拟机上。
  3. 作为一种拷贝、克隆(clone)机制:将对象序列化到内存的缓存区中。然后通过反序列化,可以得到一个对已存对象进行深拷贝的新对象。

3.Hadoop序列化机制的特征

对于处理大规模数据的 Hadoop平台,其序列化机制需要具有如下特征:

  1. 紧凑:由于带宽是 Hadoop集群中最稀缺的资源,一个紧凑的序列化机制可以充分利用数据中心的带宽。
  2. 快速:在进程间通信(包括 MapReduce过程中涉及的数据交互)时会大量使用序列化机制,因此,必须尽量减少序列化和反序列化的开销
  3. 可扩展:随着系统的发展,系统间通信的协议会升级,类的定义会发生变化,序列化机制需要支持这些升级和变化。
  4. 互操作:可以支持不同开发语言间的通信,如C++和Java间的通信。这样的通信可以通过文件(需要精心设计文件的格式)或者后面介绍的IPC机制实现。

4.Hadoop序列化API框架

java如何给map序列化 map可以序列化吗_hadoop

4.1 自定义bean对象实现序列化

1.自定义bean对象要想序列化传输,必须实现序列化接口,需要注意以下7项
(1)必须实现Writable接口
(2)反序列化时,需要反射调用空参构造函数,所以必须有空参构造器
(3)重写序列化方法
(4)重写反序列化方法
(5)注意反序列化的顺序和序列化的顺序完全一致
(6)要想把结果显示在文件中,需要重写toString(),且用”\t”分开,方便后续用
(7)如果需要将自定义的bean放在key中传输,则还需要实现WritableComparable接口,因为mapreduce框中的shuffle过程一定会对key进行排序

4.2 排序比较实现示例:

实现WritableComparable接口,重写comPareTo方法

public class PairWritable implements WritableComparable<PairWritable>
/*
比较方法返回的数据:负数,0,正数。
分别表示:小于,等于,大小当前的对象
*/
@override
public int compareTo(PairWritable o) {
}