1. 程式人生 > >hadoop學習筆記(十一):MapReduce數據類型

hadoop學習筆記(十一):MapReduce數據類型

筆記 ash all 記錄 write 一個 操作 png bool

一、序列化

1 hadoop自定義了數據類型,在hadoop中,所有的key/value類型必須實現Writable接口。有兩個方法,一個是write,一個是readFileds。分別用於讀(反序列化操作)和寫(序列化操作)。

2 所有的key必須實現Comparable接口,在MapReduce過程中需要對key/value對進行反復的排序,默認情況下依據key進行排序,要實現compareTo()方法,所以通過key既要實現Writable接口又要實現Comparable接口。

3 因此,hadoop中提供了一個公共的接口WritableComparable接口,這個接口繼承了Writable和Comaprable接口。

4 由於需要序列化和反序列化和比較,需要對java對象重寫一下幾個方法:

  1、equlas()方法。

  2、hashcode()方法。

  3、toString()方法。

  4、數據類型必須有一個默認的無參的構造方法,為了方便反射,進行創建對象。

序列化的概念:

所謂序列化(serialization),是指將結構化對象轉化為字節流,以便在網絡上傳輸或寫到磁盤進行永久存儲

在分布式數據裏的兩大領域裏,序列化經常出現,進程間通信和永久存儲

在hadoop中,系統多個節點上進程間的通信是通過“遠程過程調用”(remote procedure call,RPC)實現的。RPC協議將消息序列化

成二進制流後發送到遠程節點,遠程節點接著將二進制流反序列化為原始消息。

hadoop使用自己的序列化格式(Writable),它格式緊湊、速度快,但很難用Java以外的語言進行擴展或使用。因為Writable是hadoop核心(大多數MapReduce程序都會以鍵和值使用它)。

反序列化的概念:

反序列化是指將字節流轉回結構化對象的過程。

二、數據類型

數據類型都實現了Writable接口,以便用這些類型定義的數據可以被序列化進行網絡傳輸和文件存儲。

基本數據類型:

Java基本數據類型 名稱 類型 序列化大小
boolean BooleanWritable 標準布爾類型數值 1
byte ByteWritable 單字節數值 1
double DoubleWritable 雙字節數值 8
float FloatWritable 浮點數 4
int IntWritable 整型數 4
VintWritable 可變長度整型數 1~5
long LongWritable  長整型數 8
VlongWritable 可變長度長整型數 1~9
Text 使用UTF-8格式存儲文本
NullWritable 當<key,value>中的key或value為空時使用

註意:在自定義數據類型中,建議使用java原生的數據類型,最好不要使用hadoop封裝的數據類型。

三、比較器(Comparable)

當數據寫入磁盤時,如果要進行排序的話, 需要首先從磁盤讀取數據,進行反序列化成對象,然後在內存中對反序列化的對象進行比較。為什麽不直接在內存中就直接進行比較呢?

如果要實現上述功能,hadoop數據類型需要實現一個接口RawComparator接口

RawComarator

技術分享圖片

對MapReduce來說,類型的比較是非常重要的,因為中間有一個基於鍵的排序階段。hadoop提供的一個優化接口是繼承自Java Comparator的RawComparator接口。

該接口允許其實現直接比較數據流中的記錄,無須先把數據反序列化為對象,這樣便避免了新建對象的額外開銷。例如,我們根據IntWritable接口實現的comparator實現了comare()方法,該方法可以從每個字節數組b1和b2中讀取給定起始位置(s1和s2)以及長度(l1和l2)的一個整數進而直接進行比較。

WritableComarator是對繼承自WritableComparable類的RawComaparator類的一個通用實現,它提供兩個主要功能。

第一、它提供了對原始compare()方法的一個默認實現,該方法能夠反序列化在流中進行比較的對象,並調用對象的compare()方法。

第二、它充當的是RawComparator實例的工廠(已註冊Writable的實現)。例如,為了獲得IntWritable的comparator,我們直接如下調用:

技術分享圖片

這個comparator可以用於比較兩個IntWritable對象;

技術分享圖片

或其序列化表示:

技術分享圖片

hadoop學習筆記(十一):MapReduce數據類型