序列化概述
序列化定義
- 序列化就是把內存中的對象轉換成字節序列 (或者其他數據傳輸協議) 以便於儲存到磁盤 (持久化) 和網絡傳輸。
- 反序列化就是將接收到的字節序列 (或其他數據傳輸協議) 或者是磁盤持久化數據,轉換成爲內存中的對象。
序列化的應用
對象只存在於內存中,關機斷電就沒有了,而且激活的對象只能由本地的進程使用,不能被髮送到網絡上的另一臺計算機上。序列化是程序數據存儲的一種形式。儲存的數據可以被再次提取以及發送到另一臺設備上。
Hadoop序列化
Java的序列化是一個重量級的序列化框架 (Serializable),一個對象被序列化後,會附帶很多額外的信息(各種校驗信息,Header,繼承體系等),不便於在網絡中高效的傳輸。所以,Hadoop自己開發了一套序列化機制(Writable)。
Hadoop序列化的特點
- 緊湊: 高效使用儲存空間。
- 快速:讀寫數據的額外開銷小。
- 可擴展:隨着通信協議的升級而可以升級。
- 互操作:支持多種語言交互。
Hadoop對應Java序列化類
Java中的常用類型,在Hadoop中都有對應的序列化實現類。其對應關係如下圖所示:
Hadoop 自定義對象序列化
在企業開發中往往常用的基本序列化類型不能滿足所有需求,比如在Hadoop框架內部傳遞一個bean對象,那麼該對象就需要實現序列化接口。
具體實現bean對象序列化步驟如下7步。
- 必須實現Writable接口
- 反序列化時,需要反射調用空參構造函數,所以必須有空參構造
public Bean() {
super();
}
- 重寫序列化方法
@Override
public void write(DataOutput out) throws IOException {
out.writeLong(attr1);
out.writeLong(attr2);
out.writeLong(attr3);
}
- 重寫反序列化方法
@Override
public void readFields(DataInput in) throws IOException {
attr1 = in.readLong();
attr2 = in.readLong();
attr3 = in.readLong();
}
- 注意反序列化的順序和序列化的順序完全一致
- 如果需要將自定義的bean放在key中傳輸,則還需要實現Comparable接口,因爲MapReduce框中的Shuffle過程要求對key必須能排序。