天天看點

十二、hadoop的序列化一、序列化基本概述二、hadoop中序列化

序列化就是将記憶體中的對象,轉換成位元組序列(或者按照其他資料傳輸協定轉換),以便于持久化存儲到磁盤中以及網絡傳輸

一般情況下,對象隻存儲在本地的記憶體中,隻允許本地的程序調用。而随着分布式程式的出現,需要在不同的主機上不同程序調用對象,這就需要将對象通過網絡傳輸到另外的主機上。但是對象不經過處理無法通過網絡傳輸,而通過序列化處理之後,對象可以通過網絡傳輸了。

java中自行實作了序列化方案,隻要定義一個類的時候實作 Serializable 接口,那麼java内部就會自動實作相應的序列化。如:

但是由于Java中的序列化接口實作的時候,會附帶很多額外的資訊,如各種校驗資訊,header,繼承體系等。不便于在網絡上高效傳輸(性能不高)。是以hadoop自己額外實作了序列化的機制,體積短小,占用帶寬低,序列化和反序列化快速

hadoop中以實作 Writable 這個接口的類,就可以序列化。而且hadoop實作了許多基本類型的可序列化的類。依賴圖如下所示:

十二、hadoop的序列化一、序列化基本概述二、hadoop中序列化

​ 圖 2.1 hadoop序列化依賴圖

可以看到所有的可序列化的類都實作了 WritableComparable 這個接口,這個接口同時繼承了 Writable 以及 Comparable 接口。下面看看這個這三個接口:

java類型

hadoop writable類型

boolean

BooleanWritable

byte

ByteWritable

Int

IntWritable

float

FloatWritable

long

LongWritable

double

DoubleWritable

string

Text

map

MapWritable

array

ArrayWritable

下面挑個IntWritable這個常用的序列化類來看看源碼

其他short,long的序列化類的實作也是類似的。

要點:

(1)必須實作 Writable接口

(2)必須有無參構造方法,因為反序列化時需要反射調用無參構造方法

(3)重寫序列化方法

(4)重寫反序列化方法

(5)序列化寫入和反序列化讀取時要注意,寫入和讀取的順序必須完全一緻

(6)按照需要可以重寫 toSting 方法,便于儲存在檔案中的内容

(7)如果該自定義序列化類是作為鍵值對中的key使用的話,因為MapReduce中會以key進行排序,那麼就會涉及到 key 的比較問題。是以需要實作 Comparable 接口。而該接口就得實作 compareTo 方法

首先屬性中的自定義類也是需要實作序列化接口的。是以下面的DateDimension和ContactDimension都是已經實作序列化的了。