【框架解析】Hadoop系统分析(十)--对象序列化

来源:互联网 发布:用matlab解决优化问题 编辑:程序博客网 时间:2024/06/10 00:46

hadoop的内部数据传输涉及到三个角色之间的数据传输:

  1. Client - NameNode
  2. Client - DataNode
  3. DataNode - NameNode
  4. DataNode - DataNode

之间的通信使用的是rpc方式,那么rpc的过程就需要涉及对象的序列化。
hadoop的源码中实现了两套序列化,一套是封装了java默认的java.io.Serializable方式,但是hadoop内部使用的是自己实现的org.apache.hadoop.io.Writable方式,而hadoop日常使用到的可序列化对象基本都放在org.apache.hadoop.io包中。
大致的实现结构如下(图中展现了可序列化的java基本类型,其他业务对象没有列出)

  1. SerializationFactory
    序列化工厂,初始化时从配置项io.serializations中获取序列化工具,默认使用org.apache.hadoop.io.serializer.WritableSerialization作为序列化工具。
    通过调用getSerializer和getDeserializer来获取序列化与反序列化工具。
  2. JavaSerialization
    封装了java的序列化反序列化工具
    1. JavaSerializationSerializer
      使用java.io.Serializable来进行对象的序列化操作
    2. JavaSerializationDeserializer
      使用java.io.Serializable来进行对象的反序列化操作
  3. WritableSerialization
    封装了hadoop实现的序列化反序列化机制
    1. WritableSerializer
      使用org.apache.hadoop.io.Writable实现对象的序列化机制
      1. open
        打开数据流,准备往DataOutputStream中写入序列化对象
      2. close
        完成写入序列化对象后,关闭数据流
      3. serialize
        调用Writable.write来执行序列化过程
    2. WritableDeserializer
      使用org.apache.hadoop.io.Writable实现对象的反序列化机制
      实例化时需要传入进行deserializer的对象的对应Class。
      1. open
        打开DataInputStream,准备读取deserilizer时需要的数据
      2. close
        deserilizer完毕时关闭DataInputStream
      3. deserialize
        调用对象的Writable.readFields方法进行deserilizer
  4. Writable
    序列化反序列化接口,只有两个方法分别用于序列化写数据与反序列化读数据
    1. write
      序列化时将数据从对象写入到输出流
    2. readFields
      反序列化时将数据从输入流读取到对象中
    3. 默认实现
      实现对应于javaMapWritableMapSortedMapWritable可排序MapArrayWritable数组TwoDArrayWritable二维数组
  5. WritableComparable
    可进行比较的可序列化对象,集成了Writable与Comparable接口。
    默认实现对应于javaBooleanWritablebooleanTextStringNullWritablenullFloatWritablefloatIntWritableintBytesWritablebyte[]ByteWritablebyteLongWritablelongDoubleWritabledoubleVIntWritableint(可变长度int,在序列化时会进行压缩)VLongWritablelong(可变长度long,在序列化时会进行压缩)ObjectWritableObject
  6. ObjectWritable
    ObjectWritable相对特殊,它能够包装其他对象后进行序列化反序列化,序列化后的格式如下:
    对象名称对象内容

    支持的对象有

    java基本类型,包括Boolean,Character,Byte,Short,Integer,Long,Float,Double,null数组ArrayString其他Writable
原创粉丝点击