HADOOP 的 I/O 是由传统的 I/O 系统发展而来,需要处理 PB、TB级别的数据,所以包含类一些面向海量数据处理的基本输入输出工具。
1、序列化:
对象的序列化用于将对象编码为一个字节流,以及从字节流中重新构建对象。
将一个对象编码成一个自己流称为序列化该对象(Serializing)
相反的处理过程称为反序列化(Deserializing)
2、序列化有三种主要的用途:
1)作为一种持久化格式,存储到磁盘。
2)作为一种通信数据格式,从一个服务器传到另一个
3)作为 copy 和 clone 的机制,序列化到内存或者缓存中,反序列化得到已存对象进行深拷贝的新对象
hadoop 主要使用了前两种用途。
3、hadoop 的序列化调用对象的 write() 方法,反序列化调用的对象的 readFields(),从流中读取数据。
java 中的反序列化会不断的创建新的对象,hadoop 序列化机制中的反序列化,用户可以复用对象。如:在BLOCK 对象上反复调用 readFields(),可以得到同一个对象的多个反序列化结果,而不是多个反序列化的结果对象,减少了java对象的分配和回收。
与java 序列化相比,hadoop 的序列化结果紧凑且快速。
4、hadoop 序列化的机制和特征
1)紧凑,hadoop 是宽带稀缺类型的,I/O是瓶颈。
2)快速,进程间通信调用了大量的序列化和反序列化。
3)可扩展,随着发展需要支持系统的扩展和升级
4)互操作,可以支持不同语言间的通信。
5、org.apache.hadoop.io.Writable 是所有可以序列化对象必须实现的接口
该接口有两个方法:
void write(DataOutput out) throws IOException;
将(序列化)对象状态写入二进制的 DataOutput 中。
void readFields(DataInput in) throws IOException;
反序列化过程由readFields 从DataInput 流中读取状态完成。
6、其他比较重要的接口:WritableComparable、RawComparator、WritableComparator
WritableComparable 提供类型比较的能力,继承自Writable, Comparable(用于类型比较)。ByteWritable,IntWritable,DoubleWritable 等基本类型对应的 Writable 类型都继承自 WritableComparable。
RawComparator 具有比较高效的比较能力,接口允许执行者比较流中读取的未被反序列化为对象的记录,省去了创建对象的开销。
WritableComparator 是RawComparator对WritableComparable 类的的一个通用实现。有个两主要功能:
1、提供了一个RawComparator 的 compare()默认实现。
2、充当了 RawComparator 实例的一个工厂方法。
除了以上介绍的 Hadoop 使用的 Writable 机制,还流行其他的序列化框架,如 Hadoop Avro,Apache Thrift 和 Google Protocol Buffer 。
1)Hadoop Avro 是一个数据序列化系统,用于支持大批量数据交换的应用。它的主要特点有:支持二进制序列化系统,可以便捷快速的处理大量的数据,动态语言友好。
2)Thrift 是一个可伸缩的、跨语言的服务开发框架,由facebook 贡献给开源社区,facebook 核心框架之一。(参考 contrib 的 thriftfs 模块)
3)Google Protocol Buffer 是 Google 内部的混合语言数据标准,提供了一种轻便高效的结构化数据存储格式。提供了 C++,Java,Python 三种语言的API,广泛应用于Google 内部的通信协议,数据存储等领域。
在Hadoop 中简单的提供了一个序列化框架的API,用于集成各种序列化实现,该框架由 Serialization 实现(org.apache.hadoop.io.serializer包中)。
若是喜欢,帮我点个赞。