美文网首页我爱编程
Hadoop序列化和反序列化

Hadoop序列化和反序列化

作者: yannhuang | 来源:发表于2017-11-24 15:51 被阅读111次

    在hadoop中实现了一套自己的序列化框架,相对于JDK自带的序列化工具,它更加简洁,在集群信息的传递上速度更快,容量更小。特点如下:

    1. 数据紧凑
    带宽是集群中信息传递的最宝贵的资源,所以我们必须设法缩小传递信息的大小。为了更好的控制序列化整个流程使用Writable对象,java序列化过程中会保存类的所有信息以及依赖等,Hadoop序列化不需要。

    2. 对象可重用
    JDK的反序列化会不断地创建对象,这肯定会造成一定的系统开销,但是在hadoop反序列化中,能重复的利用一个对象的readField方法来重新产生不同的对象。

    3. 可扩展性
    hadoop自己写序列化很容易,可以通过实现hadoop的Writable接口实现序列化,或者实现WritableComparable接口实现可比较大小的序列化对象。

    一、Hadoop Writable框架

    Writable 接口如下:

    @InterfaceAudience.Public
    @InterfaceStability.Stable
    public interface Writable {
      /** 
       * 序列化一个对象,将一个对象按照某个数据传输格式写入到out流中
       * @param out <code>DataOuput</code> to serialize this object into.
       * @throws IOException
       */
      void write(DataOutput out) throws IOException;
    
      /** 
       * 反序列化,从in流中读入字节,按照某个数据传输格式读出到一个对象中
       * @param in <code>DataInput</code> to deseriablize this object from.
       * @throws IOException
       */
      void readFields(DataInput in) throws IOException;
    }
    

    二、Java基本类型的Writable类

    Java基本类型 Writable实现 序列化大小
    String Text
    null NullWritable 0
    boolean BooleanWritable 1
    byte ByteWritable 1
    short ShortWritable 2
    int IntWritable 4
    float FloatWritable 4
    long LongWritable 8
    double DoubleWritable 8

    三、自定义类型示例(实现WritableComparable接口)

    package com.seriable;
    
    import java.io.DataInput;
    import java.io.DataOutput;
    import java.io.IOException;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.io.WritableComparable;
    
    public class PeopleWritable implements WritableComparable<PeopleWritable> {
        private IntWritable age;
        private Text name;
        public PeopleWritable(){
        }
        public PeopleWritable(IntWritable age, Text name) {
            super();
            this.age = age;
            this.name = name;
        }
        public IntWritable getAge() {
            return age;
        }
        public void setAge(IntWritable age) {
            this.age = age;
        }
        public Text getName() {
            return name;
        }
        public void setName(Text name) {
            this.name = name;
        }
        //序列化方法
        public void write(DataOutput out) throws IOException {
            age.write(out);
            name.write(out);
        }
        //反序列化方法
        public void readFields(DataInput in) throws IOException {
            age.readFields(in);
            name.readFields(in);
        }
        //比较函数,使得对象可比较大小
        public int compareTo(PeopleWritable o) {
            int cmp = age.compareTo(o.getAge());
            if(0 !=cmp)return cmp;
            return name.compareTo(o.getName());
        }
    }
    

    相关文章

      网友评论

        本文标题:Hadoop序列化和反序列化

        本文链接:https://www.haomeiwen.com/subject/mxkfbxtx.html