hadoop的内部数据传输涉及到三个角色之间的数据传输:
- Client - NameNode
- Client - DataNode
- DataNode - NameNode
- DataNode - DataNode
之间的通信使用的是rpc方式,那么rpc的过程就需要涉及对象的序列化。
hadoop的源码中实现了两套序列化,一套是封装了java默认的java.io.Serializable方式,但是hadoop内部使用的是自己实现的org.apache.hadoop.io.Writable方式,而hadoop日常使用到的可序列化对象基本都放在org.apache.hadoop.io包中。
大致的实现结构如下(图中展现了可序列化的java基本类型,其他业务对象没有列出)
- SerializationFactory
序列化工厂,初始化时从配置项io.serializations中获取序列化工具,默认使用org.apache.hadoop.io.serializer.WritableSerialization作为序列化工具。
通过调用getSerializer和getDeserializer来获取序列化与反序列化工具。 - JavaSerialization
封装了java的序列化反序列化工具- JavaSerializationSerializer
使用java.io.Serializable来进行对象的序列化操作 - JavaSerializationDeserializer
使用java.io.Serializable来进行对象的反序列化操作
- JavaSerializationSerializer
- WritableSerialization
封装了hadoop实现的序列化反序列化机制- WritableSerializer
使用org.apache.hadoop.io.Writable实现对象的序列化机制- open
打开数据流,准备往DataOutputStream中写入序列化对象 - close
完成写入序列化对象后,关闭数据流 - serialize
调用Writable.write来执行序列化过程
- open
- WritableDeserializer
使用org.apache.hadoop.io.Writable实现对象的反序列化机制
实例化时需要传入进行deserializer的对象的对应Class。- open
打开DataInputStream,准备读取deserilizer时需要的数据 - close
deserilizer完毕时关闭DataInputStream - deserialize
调用对象的Writable.readFields方法进行deserilizer
- open
- WritableSerializer
- Writable
序列化反序列化接口,只有两个方法分别用于序列化写数据与反序列化读数据- write
序列化时将数据从对象写入到输出流 - readFields
反序列化时将数据从输入流读取到对象中 - 默认实现
实现 对应于java MapWritable Map SortedMapWritable 可排序Map ArrayWritable 数组 TwoDArrayWritable 二维数组
- write
- WritableComparable
可进行比较的可序列化对象,集成了Writable与Comparable接口。默认实现 对应于java BooleanWritable boolean Text String NullWritable null FloatWritable float IntWritable int BytesWritable byte[] ByteWritable byte LongWritable long DoubleWritable double VIntWritable int(可变长度int,在序列化时会进行压缩) VLongWritable long(可变长度long,在序列化时会进行压缩) ObjectWritable Object - ObjectWritable
ObjectWritable相对特殊,它能够包装其他对象后进行序列化反序列化,序列化后的格式如下:对象名称 对象内容 支持的对象有
java基本类型,包括Boolean,Character,Byte,Short,Integer,Long,Float,Double,null 数组Array String 其他Writable