Hadoop 源代码分析(三)对象序列化

由于Hadoop 的MapReduce 和HDFS 都有通信的需求,需要对通信的对象进行序列化。Hadoop 并没有采用Java 的序列化,而是引入了它自己的系统。org.apache.hadoop.io 中定义了大量的可序列化对象,他们都实现了Writable 接口。实现了Writable 接口的一个典型例子如下:Java 代码1. public class MyWritable implements Writable {2. // Some data3. private int counter;4. private long timestamp;5.6. public void write(DataOutput out) throws IOException {7. out.writeInt(counter);8. out.writeLong(timestamp);9. }10.11. public void readFields(DataInput in) throws IOException {12. counter = in.readInt();13. timestamp = in.readLong();14. }15.16. public static MyWritable read(DataInput in) throws IOException {17. MyWritable w = new MyWritable();18. w.readFields(in);19. return w;20. }21.}其中的write 和readFields 分别实现了把对象序列化和反序列化的功能,是Writable 接口定义的两个方法。下图给出了庞大的org.apache.hadoop.io 中对象的关系。

这里,我把ObjectWritable 标为红色,是因为相对于其他对象,它有不同的地位。当我们讨论Hadoop 的RPC 时,我们会提到RPC上交换的信息,必须是Java 的基本类型,String 和Writable 接口的实现类,以及元素为以上类型的数组。ObjectWritable 对象保存了一个可以在RPC 上传输的对象和对象的类型信息。这样,我们就有了一个万能的,可以用于客户端/服务器间传输的Writable 对象。例如,我们要把上面例子中的对象作为RPC 请求,需要根据MyWritable 创建一个ObjectWritable,ObjectWritable 往流里会写如下信息对象类名长度,对象类名,对象自己的串行化结果这样,,到了对端,ObjectWritable 可以根据对象类名创建对应的对象,并解串行。应该注意到,ObjectWritable 依赖于WritableFactories,那存

储了Writable 子类对应的工厂。我们需要把MyWritable 的工厂,保存在WritableFactories 中(通过WritableFactories.setFactory)。

更多分享请关注: 关注超人学院微信:BJ-CRXY

每一件事都要用多方面的角度来看它

Hadoop 源代码分析(三)对象序列化

相关文章:

你感兴趣的文章:

标签云: