hadoop需要处理P、T级别的数据,所以在org.apache.hadoop.io中包含一些面向海量数据处理的基本工具。
对象的序列化(Serialization)用于将对象编码成一个字节流,以及从字节流中重新构建一个对象。相反的,处理过程称为反序列化(Deserializing)
序列化有三种主要的用途:
将对象转换为连续的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需要新的一个序列化机制。
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);//序列化到输出流doutdout.close();System.out.println(......);SerializationExample.ByteArray(),bout.size());}
}
hadoop的序列化结果紧凑而且快速。
为支持以上特性,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>,Serializable{.
本文发布于:2024-01-27 23:55:29,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17063709333409.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |