Hadoop權(quán)威指南-ch4 Hadoop的I/O(3) 序列化

注:本文涉及書(shū)中4.3小結(jié)

序列化與反序列化

1. 定義

序列化(serialization):將結(jié)構(gòu)化對(duì)象轉(zhuǎn)化為字節(jié)流。

反序列化(deserialization):將字節(jié)流轉(zhuǎn)回結(jié)構(gòu)化對(duì)象的逆過(guò)程。

2. 應(yīng)用場(chǎng)景

序列化在分布式數(shù)據(jù)處理的兩大領(lǐng)域經(jīng)常出現(xiàn):進(jìn)程間通信永久存儲(chǔ)。

在Hadoop中,多個(gè)節(jié)點(diǎn)上的進(jìn)程間通信是通過(guò)RPC(遠(yuǎn)程過(guò)程調(diào)用)實(shí)現(xiàn)的。RPC協(xié)議將消息序列化成二進(jìn)制流后發(fā)送到遠(yuǎn)程節(jié)點(diǎn),遠(yuǎn)程節(jié)點(diǎn)再將二進(jìn)制流反序列化為原始消息。

Hadoop使用序列化格式Wriable,這是Hadoop的核心。


補(bǔ)充

在Hadoop中,Mapper,Combiner,Reducer等階段之間的通信都需要使用序列化與反序列化技術(shù)。舉例來(lái)說(shuō),Mapper產(chǎn)生的中間結(jié)果(<key: value1, value2, ···>)需要寫(xiě)入到本地硬盤(pán),這是序列化過(guò)程(將結(jié)構(gòu)化對(duì)象轉(zhuǎn)化為字節(jié)流,并寫(xiě)入硬盤(pán)),而Reducer階段讀取Mapper的中間結(jié)果的過(guò)程則是一個(gè)反序列化過(guò)程(讀取硬盤(pán)上存儲(chǔ)的字節(jié)流文件,并轉(zhuǎn)回為結(jié)構(gòu)化對(duì)象),需要注意的是,能夠在網(wǎng)絡(luò)上傳輸?shù)闹荒苁亲止?jié)流,Mapper的中間結(jié)果在不同主機(jī)間洗牌時(shí),對(duì)象將經(jīng)歷序列化和反序列化兩個(gè)過(guò)程。

序列化是Hadoop核心的一部分,在Hadoop中,位于org.apache.hadoop.io包中的Writable接口是Hadoop序列化格式的實(shí)現(xiàn)。


Writable接口

Writable接口定義了兩個(gè)方法:

1. 狀態(tài)寫(xiě):將其狀態(tài)寫(xiě)到DataOutput二進(jìn)制流。

2. 狀態(tài)讀:DataOutput二進(jìn)制流讀取狀態(tài)。

WritableComparable接口和comparator


補(bǔ)充

書(shū)中說(shuō)的不太明白,故自己比較一下:Comparable接口 VS Comparator接口

在?“?集合框架?”?中有兩種比較接口:?Comparable?接口和?Comparator?接口。?Comparable?是通用的接口,用戶可以實(shí)現(xiàn)它來(lái)完成自己特定的比較,而?Comparator?可以看成一種算法的實(shí)現(xiàn),在需要容器集合實(shí)現(xiàn)比較功能的時(shí)候,來(lái)指定這個(gè)比較器,這可以看成一種設(shè)計(jì)模式,將算法和數(shù)據(jù)分 離。前者應(yīng)該比較固定,和一個(gè)具體類相綁定;而后者比較靈活,它可以被用于各個(gè)需要比較功能的類使用。

一個(gè)類實(shí)現(xiàn)了?Camparable?接口表明這個(gè)類的對(duì)象之間是可以相互比較的。如果用數(shù)學(xué)語(yǔ)言描述的話就是這個(gè)類的對(duì)象組成的集合中存在一個(gè)全序。這樣,這 個(gè)類對(duì)象組成的集合就可以使用?Sort?方法排序了。

而?Comparator?的作用有兩個(gè):

1?、如果類的設(shè)計(jì)師沒(méi)有考慮到?Compare?的問(wèn)題而沒(méi)有實(shí)現(xiàn)?Comparable?接口,可以通過(guò)?Comparator?來(lái)實(shí)現(xiàn)比較算法進(jìn)行排序;

2?、為了使用不同的排序標(biāo)準(zhǔn)做準(zhǔn)備,比如:升序、降序或其他什么序。


Writable類

Hadoop自身提供了多種具體的Writable類,封裝了常見(jiàn)的Java基本類型(boolean、byte、short、int、float、long和double等)和集合類型(BytesWritable、ArrayWritable和MapWritable等)。這些類型都位于org.apache.hadoop.io包中。

1. Java基本類型的Writable封裝器

所有的封裝包含get()set()兩種方法,用于讀取和存儲(chǔ)封裝的值。

2. Text類型

Text是針對(duì)UTF-8序列的Writable類。

Text類型的索引、迭代、可變性、對(duì)String重新排序,詳見(jiàn)書(shū)4.3.2小節(jié)。

書(shū)中還有:Text與String的比較

3. BytesWritable

BytesWritable是對(duì)二進(jìn)制數(shù)據(jù)數(shù)組的封裝。

它的序列化格式為:一個(gè)指定所含數(shù)據(jù)字節(jié)數(shù)的整數(shù)域(4字節(jié),即8bit),后跟數(shù)據(jù)內(nèi)容本身。

4. NullWritable

NullWritable是Writable的特殊類型,它的序列化長(zhǎng)度為0,既不從數(shù)據(jù)流中讀取數(shù)據(jù),也不寫(xiě)入數(shù)據(jù),充當(dāng)占位符。

5. ObjectWritable和GenericWritable

ObjectWritable是對(duì)Java基本類型(String, enum, Writable, null或這些類型組成的數(shù)組)的一個(gè)通用封裝。它在Hadoop RPC中用于對(duì)方法的參數(shù)和返回類型進(jìn)行封裝和解封裝。當(dāng)一個(gè)字段包含多種類型時(shí),ObjectWritable非常有用

Objectwritable?作為一個(gè)通用機(jī)制,這是相當(dāng)浪費(fèi)空間的,因?yàn)槊看嗡恍蛄谢猓家獙?xiě)入被封裝類型的類名。GenericWritable 對(duì)此做出了改進(jìn),如果類型的數(shù)量不多并且事先可知,那么可以使用一個(gè)靜態(tài)類型數(shù)組來(lái)提高效率,使用數(shù)組的索引來(lái)作為類型的序列化引用.這是GenericWritable?使用的方法,我們必須繼承它以指定支持的類型。

6. Writable集合類

共有6個(gè)Writable集合類:

(1)+(2)ArrayWritable和TwoDArrayWritable

它們是對(duì)Writable的數(shù)組和二維數(shù)組的實(shí)現(xiàn)。常用函數(shù)包括toArray()、get()、set()

(3)ArrayPrimitiveWritable

對(duì)Java基本數(shù)組類型的一個(gè)封裝。

(4)+(5)+(6)MapWritable,SortedMapWritable,EnumMapWritable

MapWritable:對(duì)集合和列表,枚舉集合中的元素

SortedMapWritable:針對(duì)排序集合,枚舉集合中的元素

EnumMapWritable:對(duì)集合的枚舉類型采用EnumMapWritable


補(bǔ)充

AbstractMapWritable作為MapWritable抽象類并沒(méi)有涉及到Map的鍵值對(duì)操作,而是從抽象層抽象出索引表,其實(shí)現(xiàn)類MapWritable和SortedMapWritable則是新增了Map變量,不同的之處在于SortedMapWritable是實(shí)現(xiàn)了排序了的TreeMap,自身已具有排序功能。


定制的Writable集合

書(shū)中范例4-7實(shí)現(xiàn)了存儲(chǔ)一對(duì)Text對(duì)象的Writable

序列化框架

大部分的MapReduce程序都使用Writable鍵–值對(duì)作為輸入和輸出,但這并不是Hadoop強(qiáng)制使用的,其他序列化機(jī)制也能和Hadoop配合,并應(yīng)用于MapReduce中。

目前,除了前面介紹過(guò)的Java序列化機(jī)制和Hadoop使用的Writable機(jī)制,還流行其他序列化框架,如Hadoop Avro、Apache Thrift和Google Protocol Buffer。

1. 序列化框架(Serialization)

MapReduce僅僅可以支持Writable做key,value嗎?答案是否定的。事實(shí)上,可以使用任何類型:只要能有一種機(jī)制能對(duì)每個(gè)類型進(jìn)行類型與二進(jìn)制表示的來(lái)回轉(zhuǎn)換。為此Hadoop提供了一個(gè)針對(duì)序列化做替換的框架來(lái)支持,他們?cè)趏rg.apache.hadoop.io.serializer包中,Writable可以作為MapReduce支持的類型也是因?yàn)閷?shí)現(xiàn)了這個(gè)框架,類不多,我們從幾個(gè)接口說(shuō)起。

Hadoop提供了一個(gè)簡(jiǎn)單的序列化框架API,用于集成各種序列化實(shí)現(xiàn),該框架由Serialization實(shí)現(xiàn)(在org.apache.hadoop.io.serializer包中)。

2. 序列化IDL

還有許多其他序列化框架從不同的角度來(lái)解決該問(wèn)題:即不通過(guò)代碼來(lái)定義類型,而是使用IDL(Interface Description Language, 接口定義語(yǔ)言)以不依賴于具體語(yǔ)言的方式進(jìn)行聲明。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,491評(píng)論 3 416
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,263評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,946評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,708評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,186評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,409評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,939評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,774評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,976評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,209評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,641評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,872評(píng)論 1 286
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,650評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,958評(píng)論 2 373

推薦閱讀更多精彩內(nèi)容

  • 科多大數(shù)據(jù)帶你來(lái)看Java Object Serialization與 Hadoop 序列化。 一、Java Ob...
    大數(shù)據(jù)在說(shuō)話閱讀 472評(píng)論 0 3
  • JAVA序列化機(jī)制的深入研究 對(duì)象序列化的最主要的用處就是在傳遞,和保存對(duì)象(object)的時(shí)候,保證對(duì)象的完整...
    時(shí)待吾閱讀 10,891評(píng)論 0 24
  • 目的這篇教程從用戶的角度出發(fā),全面地介紹了Hadoop Map/Reduce框架的各個(gè)方面。先決條件請(qǐng)先確認(rèn)Had...
    SeanC52111閱讀 1,748評(píng)論 0 1
  • 作者/胄寧 年年今朝, 歲又今朝, 今朝有酒恨難醉。 夜夜難眠, 今又難眠, 難眠望穿夢(mèng)不圓。 祈愿, 一飛沖天。...
    胄寧閱讀 190評(píng)論 0 2
  • 第一傳:~入坑 說(shuō)起傳銷,我們90后的這一代聽(tīng)說(shuō)的太多了,而且,大多數(shù)人對(duì)它的印象也相當(dāng)之差;只要提到傳銷,很多...
    小紅妹談戀愛(ài)閱讀 338評(píng)論 2 0