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

12 篇文章 0 订阅

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. 默认实现
      实现对应于java
      MapWritableMap
      SortedMapWritable可排序Map
      ArrayWritable数组
      TwoDArrayWritable二维数组
  5. WritableComparable
    可进行比较的可序列化对象,集成了Writable与Comparable接口。
    默认实现对应于java
    BooleanWritableboolean
    TextString
    NullWritablenull
    FloatWritablefloat
    IntWritableint
    BytesWritablebyte[]
    ByteWritablebyte
    LongWritablelong
    DoubleWritabledouble
    VIntWritableint(可变长度int,在序列化时会进行压缩)
    VLongWritablelong(可变长度long,在序列化时会进行压缩)
    ObjectWritableObject
  6. ObjectWritable
    ObjectWritable相对特殊,它能够包装其他对象后进行序列化反序列化,序列化后的格式如下:
    对象名称对象内容

    支持的对象有

    java基本类型,包括Boolean,Character,Byte,Short,Integer,Long,Float,Double,null
    数组Array
    String
    其他Writable
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值