Hadoop Writable机制
《Hadoop技術內幕:深入解析Hadoop Common和HDFS架構設計與實現原理》第3章序列化與壓縮,本章涉及了org.apache.hadoop.io包下最重要的兩部分內容:序列化和壓縮。本節為大家介紹Hadoop Writable機制。
AD:WOT2015 互聯網運維與開發者大會 熱銷搶票
3.1.4 Hadoop Writable機制
為了支持以上這些特性,Hadoop引入org.apache.hadoop.io.Writable接口,作為所有可序列化對象必須實現的接口,其類圖如圖3-2所示。
Writable機制緊湊、快速(但不容易擴展到Java以外的語言,如C、Python等)。和java.io.Serializable不同,Writable接口不是一個說明性接口,它包含兩個方法:
Writable.write()方法用于將對象狀態寫入二進制的DataOutput中,反序列化的過程由readFields()從DataInput流中讀取狀態完成。下面是一個例子:
這個例子使用的是前面分析Java序列化機制的Block類,Block實現了Writable接口,即需要實現write()方法和readFields()方法,這兩個方法的實現都很簡單:Block有三個成員變量,write()方法簡單地把這三個變量寫入流中,而readFields()則從流中依次讀入這些數據,并做必要的檢查。
Hadoop序列化機制中還包括另外幾個重要接口:WritableComparable、RawComparator和WritableComparator。
WritableComparable,顧名思義,它提供類型比較的能力,這對MapReduce至關重要。該接口繼承自Writable接口和Comparable接口,其中Comparable用于進行類型比較。ByteWritable、IntWritable、DoubleWritable等Java基本類型對應的Writable類型,都繼承自WritableComparable。
效率在Hadoop中非常重要,因此HadoopI/O包中提供了具有高效比較能力的RawComparator接口。RawComparator和WritableComparable類圖如圖3-3所示。
?
RawComparator接口允許執行者比較流中讀取的未被反序列化為對象的記錄,從而省去了創建對象的所有開銷。其中,compare()比較時需要的兩個參數所對應的記錄位于字節數組b1和b2的指定開始位置s1和s1,記錄長度為l1和l2,代碼如下:
以IntWritable為例,它的RawComparator實現中(WritableComparator是一個輔助類,實現了RawComparator接口),compare()方法通過readInt()直接在字節數組中讀入需要比較的兩個整數,然后輸出Comparable接口要求的比較結果。值得注意的是,該過程中compare()方法避免使用IntWritable對象,從而避免了不必要的對象分配。相關代碼如下:
WritableComparator是RawComparator對WritableComparable類的一個通用實現。它提供兩個主要功能。首先,提供了一個RawComparator的compare()默認實現,該實現從數據流中反序列化要進行比較的對象,然后調用對象的compare()方法進行比較(這些對象都是Comparable的)。其次,它充當了RawComparator實例的一個工廠方法,例如,可以通過如下代碼獲得IntWritable的RawComparator:
總結
以上是生活随笔為你收集整理的Hadoop Writable机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 搜索背后的奥秘——浅谈语义主题计算
- 下一篇: ZeroCopyLiteralByteS