大數據 Hadoop序列化

序列化概述

序列化定義

  • 序列化就是把內存中的對象轉換成字節序列 (或者其他數據傳輸協議) 以便於儲存到磁盤 (持久化) 和網絡傳輸。
  • 反序列化就是將接收到的字節序列 (或其他數據傳輸協議) 或者是磁盤持久化數據,轉換成爲內存中的對象。

序列化的應用

對象只存在於內存中,關機斷電就沒有了,而且激活的對象只能由本地的進程使用,不能被髮送到網絡上的另一臺計算機上。序列化是程序數據存儲的一種形式。儲存的數據可以被再次提取以及發送到另一臺設備上。

Hadoop序列化

Java的序列化是一個重量級的序列化框架 (Serializable),一個對象被序列化後,會附帶很多額外的信息(各種校驗信息,Header,繼承體系等),不便於在網絡中高效的傳輸。所以,Hadoop自己開發了一套序列化機制(Writable)

Hadoop序列化的特點

  1. 緊湊: 高效使用儲存空間。
  2. 快速:讀寫數據的額外開銷小。
  3. 可擴展:隨着通信協議的升級而可以升級。
  4. 互操作:支持多種語言交互。

Hadoop對應Java序列化類

Java中的常用類型,在Hadoop中都有對應的序列化實現類。其對應關係如下圖所示:
在這裏插入圖片描述

Hadoop 自定義對象序列化

在企業開發中往往常用的基本序列化類型不能滿足所有需求,比如在Hadoop框架內部傳遞一個bean對象,那麼該對象就需要實現序列化接口。
具體實現bean對象序列化步驟如下7步。

  1. 必須實現Writable接口
  2. 反序列化時,需要反射調用空參構造函數,所以必須有空參構造
public Bean() {
	super();
}
  1. 重寫序列化方法
@Override
public void write(DataOutput out) throws IOException {
	out.writeLong(attr1);
	out.writeLong(attr2);
	out.writeLong(attr3);
}
  1. 重寫反序列化方法
@Override
public void readFields(DataInput in) throws IOException {
	attr1 = in.readLong();
	attr2 = in.readLong();
	attr3 = in.readLong();
}
  1. 注意反序列化的順序和序列化的順序完全一致
  2. 如果需要將自定義的bean放在key中傳輸,則還需要實現Comparable接口,因爲MapReduce框中的Shuffle過程要求對key必須能排序。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章