Hadoop Common 之序列化机制小解

1.Java Serializable序列化

该序列化通过ObjectInputStreamreadObject实现序列化,ObjectOutputStreamwriteObject实现反序列化。这不过此种序列化虽然跨病态兼容性强,但是因为存储过多的信息,但是传输效率比较低,所以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)

你可能感兴趣的:(#,Apache,Hadoop)