日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hadoop Writable机制

發布時間:2025/7/14 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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接口不是一個說明性接口,它包含兩個方法:

  • public?interface?Writable?{ ?
  • ??/** ?
  • ???*?輸出(序列化)對象到流中 ?
  • ???*?@param?out?DataOuput流,序列化的結果保存在流中 ?
  • ???*?@throws?IOException ?
  • ???*/ ?
  • ??void?write(DataOutput?out)?throws?IOException; ?
  • ?
  • ?/** ?
  • ???*?從流中讀取(反序列化)對象 ?
  • ???*?為了效率,請盡可能復用現有的對象 ?
  • ???*?@param?in?DataInput流,從該流中讀取數據 ?
  • ???*?@throws?IOException ?
  • ???*/ ?
  • ??void?readFields(DataInput?in)?throws?IOException; ?
  • } ?
  • Writable.write()方法用于將對象狀態寫入二進制的DataOutput中,反序列化的過程由readFields()從DataInput流中讀取狀態完成。下面是一個例子:

  • public?class?Block?implements?Writable,?Comparable<Block>,?Serializable?{ ?
  • ??…… ?
  • ??private?long?blockId; ?
  • ??private?long?numBytes; ?
  • ??private?long?generationStamp; ?
  • ??…… ?
  • ??public?void?write(DataOutput?out)?throws?IOException?{ ?
  • ?????out.writeLong(blockId); ?
  • ?????out.writeLong(numBytes); ?
  • ?????out.writeLong(generationStamp); ?
  • ??} ?
  • ?
  • ?public?void?readFields(DataInput?in)?throws?IOException?{ ?
  • ?????this.blockId?=?in.readLong(); ?
  • ?????this.numBytes?=?in.readLong(); ?
  • ?????this.generationStamp?=?in.readLong(); ?
  • ?????if?(numBytes?<?0)?{ ?
  • ????????throw?new?IOException("Unexpected?block?size:?"?+?numBytes); ?
  • ?????} ?
  • ??} ?
  • ??…… ?
  • } ?
  • 這個例子使用的是前面分析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,代碼如下:

  • public?interface?RawComparator<T>extends ?
  • Comparator<T>?{ ?
  • ??public?int?compare(byte[]?b1,?int?s1,?int?l1,?byte[]?b2,?int?s2,?int?l2); ?
  • }?
  • 以IntWritable為例,它的RawComparator實現中(WritableComparator是一個輔助類,實現了RawComparator接口),compare()方法通過readInt()直接在字節數組中讀入需要比較的兩個整數,然后輸出Comparable接口要求的比較結果。值得注意的是,該過程中compare()方法避免使用IntWritable對象,從而避免了不必要的對象分配。相關代碼如下:

  • public?static?class?Comparator?extends?WritableComparator?{ ?
  • ??…… ?
  • ??public?int?compare(byte[]?b1,?int?s1,?int?l1, ?
  • ?????????????????????byte[]?b2,?int?s2,?int?l2)?{ ?
  • ?????int?thisValue?=?readInt(b1,?s1); ?
  • ?????int?thatValue?=?readInt(b2,?s2); ?
  • ?????return?(thisValue<thatValue???-1?:?(thisValue==thatValue???0?:?1)); ?
  • ??} ?
  • ??…… ?
  • }?
  • WritableComparator是RawComparator對WritableComparable類的一個通用實現。它提供兩個主要功能。首先,提供了一個RawComparator的compare()默認實現,該實現從數據流中反序列化要進行比較的對象,然后調用對象的compare()方法進行比較(這些對象都是Comparable的)。其次,它充當了RawComparator實例的一個工廠方法,例如,可以通過如下代碼獲得IntWritable的RawComparator:

  • RawComparator<IntWritable>comparator= ?
  • ??WritableComparator.get(IntWritable.class); ?
  • 總結

    以上是生活随笔為你收集整理的Hadoop Writable机制的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。