hadoop需要处理P、T级别的数据,所以在org.apache.hadoop.io中包含一些面向海量数据处理的基本工具。
1、序列化
对象的序列化(Serialization)用于将对象编码成一个字节流,以及从字节流中重新构建一个对象。相反的,处理过程称为反序列化(Deserializing)
序列化有三种主要的用途:
- 作为一种持久化格式,一个对象被序列化后,他的编码可以被存储在磁盘上,供以后反序列化使用
- 作为一种通信数据格式:序列化结果可以从一个虚拟机通过网络传到另一个虚拟机上
- 作为一种拷贝,克隆机制:将对象序列化到内存的缓存区,然后 通过反序列化,得到一个已知对象的深拷贝的新对象。
在分布式数据处理中,主要提到前面两种功能;
1.1 java内建序列化机制
将对象转换为连续的byte数据,并能自动处理不同操作上的差异,在windows系统序列化的对象可以在UNIX系统上被重建出来
在Java中一个类的实例可被序列非常简单,只需在类声明中加入implements Serializable即可。Serializable接口是一个标志,不具有任何成员函数。
public interface Serializable{
}
该接口没有任何方法所以不需要对类进行修改,Block类通过声明它实现了Serializable接口,立即可以获得Java提供的序列化功能。
public class Block implements Writable,Comparable<Block>,Serializable
由于序列化主要应用在I/O,如果想让某个对象执行序列化操作,可以在某种OutpuStream对象的基础上创建一个对象流ObjectOutputStream对象上然后调用writeObject()就可以了
writeObject()方法写入实现了Serializable接口对象的状态信息,输出数据将被送至该OutputStream。多个对象的序列化可以在ObjectOutputStream对象上多次调用writeObject()分别写入这些对象。
对于java基本类型的序列化,ObjectOutputStream提供了writeBoolean()、writeByte()等方法
输入过程类似,将InputStream包装在ObjectOutputStream中并调用readObject()方法,该方法返回一个 指向 向上转型后的Object的应用,通过向下转型,就可以得到正确结果,读取对象时,必须小心追踪存储的对象的数量、顺序以及他们的类型。
但由于java序列化机制非常聪明,关于一个类的几乎各个信息都能完整的序列化转换下来,但会膨胀的非常厉害,因此,Hadoop需要新的一个序列化机制。
1.2Hadoop序列化机制
Hadoop的序列化调用对象的wrtie()方法(带有一个类型为DataOutput的参数),将对象序列化到流中,反序列化也一样,通过对象的readFields(),从流中读取数据。
java反序列化会不断创建新的对象,而hadoop可以复用对象,而不是得到反序列化对象的结果对象,减少了java对象的分配和回收
public static void main(String[] args){
trry{
Block block1 = new Block(135456,5464,5646);
....
ByteOutputStream bout = new ByteOutputStream();
DateOutputStream dout = new DateOutputStream();
block1.wirte(dout);//序列化到输出流dout
dout.close();
System.out.println(......);
SerializationExample.print1n(out.toByteArray(),bout.size());
}
}
hadoop的序列化结果紧凑而且快速。
1.3Hadoop序列化机制的特征
- 紧凑
- 快速‘
- 可扩展
- 互操作
1.4Hadoop Writeable机制
为支持以上特性,Hadoop提供了org.apache.hadoop.io.Writable接口,作为所有可序列对象必须实现的接口。
Writeable机制紧凑,快速,Writeable接口包含两个方法
public interface Writeable{
void write(DataOutput out)throws IOException;
void readFields(DataInput in)throws IOException;
}
Writeable将对象状态写入二进制的DataOutput中,反序列化由readFields()从DataInput流中读取状态,例子如下;
public static Block implements Writable ,cpmparable<Block>,