1.Java Serializable序列化
该序列化通过ObjectInputStream
的readObject
实现序列化,ObjectOutputStream
的writeObject
实现反序列化。这不过此种序列化虽然跨病态兼容性强,但是因为存储过多的信息,但是传输效率比较低,所以hadoop弃用它。(序列化信息包括这个对象的类,类签名,类的所有静态,费静态成员的值,以及他们父类都要被写入)
public class User implements Serializable{
private Long serializableId=xxxxL; //需要指定序列化ID,用来唯一标识
}
2.Hadoop Writable序列化
由于Java Serializable序列化将每个对象的类名写入输出流中,这导致了java序列化需要占用比原对象更多的内存空间。同时java序列化会不断的创建新的对象,对mapreduce任务来说,不能重用对象,在已有的对象上进行反序列化操作,而是不断从地创建反序列化的各种类型的记录,这回带来大量的系统开销。
Hadoop Writable序列化机制需要重写write和readFields方法。并提供了DataInput
进行序列化,DataOutput
进行反序列化write方法简单地把这个变量写入到二进制流中,readFIelds则依次读入该流中的二进制数据,并做必要的检查。
3.其他Hadoop序列化框架
Avro:是一个数据序列化系统,用于支持大批量数据交换的应用。它的主要特点有:支持二进制序列化方式,可以便携、快速的处理大量数据,动态语言良好,Avro提供的机制使动态语言可以方便的处理Avro数据。
Thrift:facebook开源的
Google Protobuffer:是Google内部的混合语言数据标准,提供了一种轻便高效的结构化数据存储格式,目前ProtoBuffer提供了C++,Java,Python三种语言的API,广泛应用于Google内部通信协议,数据存储等领域中。
注:序列化是为了进行跨网络传输传输,如果是海量数据的话,可以采用Snappy压缩(其在Google的生产环境中经过了PB级数据压缩的考验-----因特尔酷睿i7)