Hadoop序列化与Java序列化

序列化就是把内存中的对象的状态信息转换成字节序列,以便于存储(持久化)和网络传输java

反序列化就是就将收到的字节序列或者是硬盘的持久化数据,转换成内存中的对象。算法

1.JDK的序列化网络

  只要实现了serializable接口就能实现序列化与反序列化,必定要加上序列化版本ID serialVersionUID,这个是用来识别序列化的以前的类究竟是哪个。好比但愿类的不一样版本对序列化兼容,须要确保类的不一样版本具备相同的serialVersionUID;框架

  Java序列化算法须要考虑:oop

  将对象实例相关的类元数据输出。spa

  递归地输出类的超类描述直到再也不有超类。对象

  类元数据完了以后,开始从最顶层的超类开始输出对象实例的实际数据值递归

  从上至下递归输出实例的数据接口

  因此java序列化很强大,序列化获得的信息很详细,可是序列化后很占内存。内存

2.Hadoop序列化

  相对于JDK比较简洁,在急群众信息的传递主要就是靠这些序列化的字节楼来传递的,因此更快速度,容量更小。

  hadoop序列化特色:

  1.紧凑:带宽是集群中信息传递的最宝贵的资源因此咱们必须想法设法缩小传递信息的大小。

     java序列化不够灵活,为了更好的控制序列化的整个流程因此使用Writable 

   java序列化会保存类的全部信息 依赖等,hadoop序列化不须要

  2.对象可重用:JDK的反序列化会不断地建立对象,这确定会形成必定的系统开销,可是在hadoop的反序列化中,能重复的利用一个对象的readField方法来从新产生不一样的对象。

     java序列化每次序列化都要从新建立对象,内存消耗大。Writable能够重用。

  3.可拓展性 

     hadoop本身写序列化很容易,能够利用实现hadoop的Writable接口 实现了直接比较字符流以肯定两个Writable对象的大小。

   而java不是,java的序列化机制在每一个类的对象第一次出现的时候保存了每一个类的信息, 好比类名, 第二次出现的类对象会有一个类的reference, 致使空间的浪费

     可使用开源的序列化框架protocol Buffers,Avro等框架

     hadoop原生的序列化类须要实现一个叫Writeable的接口,相似于serializable接口

    实现Writable接口必须实现两个方法:write(DataOutputStream out);readField(DataInputStream in)方法。

  YARN的序列化就是用Google开发的序列化框架protocol Buffers,proto目前支持支持三种语言C++,java,Python因此RPC这一层咱们就能够利用其余语言来作文章

  Apache的Thrift和Google的Protocol Buffer也是比较流行的序列化框架,可是在Hadoop里使用是有限的,只用于RPC和数据交互

相关文章
相关标签/搜索