Hadoop序列化和反序列化

在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());
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。