Hadoop的序列化和反序列化






序列化從頭說

在面向?qū)ο蟪绦蛟O(shè)計(jì)中议薪,類是個(gè)很重要的概念尤蛮。所謂“類”,可以將它想像成建筑圖紙斯议,而對(duì)象就是根據(jù)圖紙蓋的大樓产捞。類,規(guī)定了對(duì)象的一切哼御。根據(jù)建筑圖紙?jiān)旆孔优髁伲w出來的就是大樓,等同于將類進(jìn)行實(shí)例化恋昼,得到的就是對(duì)象看靠。

一開始疗隶,在源代碼里词顾,類的定義是明確的往核,但對(duì)象的行為有些地方是明確的族操,有些地方是不明確的碾阁。對(duì)象里不明確地方科盛,是因?yàn)閷?duì)象在運(yùn)行的時(shí)候兄世,需要處理無法預(yù)測(cè)的事情甜孤,諸如用戶點(diǎn)了下屏幕老速,用戶點(diǎn)了下按鈕粥喜,輸入點(diǎn)東西,或者需要從網(wǎng)絡(luò)發(fā)送接收數(shù)據(jù)之類的橘券。后來额湘,引入了泛型的概念之后,類也開始不明確了约郁,如果使用了泛型缩挑,直到程序運(yùn)行的時(shí)候,才知道究竟是哪種對(duì)象需要處理鬓梅。

對(duì)象可以很復(fù)雜供置,也可以跟時(shí)序相關(guān)。一般來說绽快,“活的”對(duì)象只生存在內(nèi)存里芥丧,關(guān)機(jī)斷電就沒有了紧阔。一般來說,“活的”對(duì)象只能由本地的進(jìn)程使用续担,不能被發(fā)送到網(wǎng)絡(luò)上的另外一臺(tái)計(jì)算機(jī)擅耽。

序列化,可以存儲(chǔ)“活的”對(duì)象物遇,可以將“活的”對(duì)象發(fā)送到遠(yuǎn)程計(jì)算機(jī)乖仇。

把“活的”對(duì)象序列化,就是把“活的”對(duì)象轉(zhuǎn)化成一串字節(jié)询兴,而“反序列化”乃沙,就是從一串字節(jié)里解析出“活的”對(duì)象。于是诗舰,如果想把“活的”對(duì)象存儲(chǔ)到文件警儒,存儲(chǔ)這串字節(jié)即可,如果想把“活的”對(duì)象發(fā)送到遠(yuǎn)程主機(jī)眶根,發(fā)送這串字節(jié)即可蜀铲,需要對(duì)象的時(shí)候,做一下反序列化属百,就能將對(duì)象“復(fù)活”了记劝。

將對(duì)象序列化存儲(chǔ)到文件,術(shù)語又叫“持久化”诸老。將對(duì)象序列化發(fā)送到遠(yuǎn)程計(jì)算機(jī)隆夯,術(shù)語又叫“數(shù)據(jù)通信”。

Java對(duì)序列化提供了非常方便的支持别伏,在定義類的時(shí)候蹄衷,如果想讓對(duì)象可以被序列化,只要在類的定義上加上了”implements Serializable”即可厘肮,比如說愧口,可以這么定義”public class Building implements Serializable”,其他什么都不要做类茂,Java會(huì)自動(dòng)的處理相關(guān)一切耍属。Java的序列化機(jī)制相當(dāng)復(fù)雜,能處理各種對(duì)象關(guān)系巩检。

Java的序列化機(jī)制的缺點(diǎn)就是計(jì)算量開銷大厚骗,且序列化的結(jié)果體積大太,有時(shí)能達(dá)到對(duì)象大小的數(shù)倍乃至十倍兢哭。它的引用機(jī)制也會(huì)導(dǎo)致大文件不能分割的問題领舰。這些缺點(diǎn)使得Java的序列化機(jī)制對(duì)Hadoop來說是不合適的。于是Hadoop設(shè)計(jì)了自己的序列化機(jī)制。

為什么序列化對(duì)Hadoop很重要冲秽?因?yàn)镠adoop在集群之間進(jìn)行通訊或者RPC調(diào)用的時(shí)候舍咖,需要序列化,而且要求序列化要快锉桑,且體積要小排霉,占用帶寬要小。所以必須理解Hadoop的序列化機(jī)制民轴。

2. Hadoop的序列化接口

什么是接口攻柠?簡答來說,接口就是規(guī)定杉武,它規(guī)定類必須實(shí)現(xiàn)的方法辙诞。一個(gè)接口可以包含多干個(gè)方法辙售。如果一個(gè)類說自己實(shí)現(xiàn)了某個(gè)接口轻抱,那么它必須實(shí)現(xiàn)這個(gè)接口里的所有方法。特殊情況下旦部,接口也可以沒有任何方法祈搜。

Writable接口,也就是org.apache.hadoop.io.Writable接口士八。Hadoop的所有可序列化對(duì)象都必須實(shí)現(xiàn)這個(gè)接口容燕。Writable接口里有兩個(gè)方法,一個(gè)是write方法婚度,將對(duì)象寫入字節(jié)流蘸秘,另一個(gè)是readFields方法,從字節(jié)流解析出對(duì)象蝗茁。

Java的API提供了Comparable接口醋虏,也就是java.lang.Comparable接口。這個(gè)接口只有一個(gè)方法哮翘,就是compareTo颈嚼,用于比較兩個(gè)對(duì)象。

WritableComparable接口同時(shí)繼承了Writable和Comparable這兩個(gè)接口饭寺。

Hadoop里的三個(gè)類IntWritable阻课、DoubleWritable和ByteWritable,都繼承了WritableComparable接口艰匙。注意限煞,IntWritable、DoubleWritable和ByteWritable员凝,盡管后綴是“Writable”署驻,但它們不是接口,是類!硕舆!




以上是摘自大神博文秽荞。

下面是自己總結(jié)代碼?




代碼:package xlh;

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;

import org.apache.hadoop.util.StringUtils;

public class inser {

/**

* 序列化步驟

* 1.聲明一個(gè)靜態(tài)的類型時(shí)數(shù)組的函數(shù),并在里面?zhèn)鬟f參數(shù)抚官,而這個(gè)參數(shù)是Hadoop 里面InWritable 類的對(duì)象

* 2.使用Java.io包下的ByteArrayOutputStream 這個(gè)類并實(shí)例化扬跋,取名為out 即輸出對(duì)象,這里是從本地文件輸入到hdfs 上 還起到把結(jié)構(gòu)化數(shù)據(jù)轉(zhuǎn)化為字符流

* 3.使用Java.io包下的DataOutputStream 類并實(shí)例化凌节,取名為dataoutput ,這里參數(shù)是out

* 4.調(diào)用InWritable 類的對(duì)像的write(); 顧名思義钦听,要把本地文件寫到hdfs上

* 5.關(guān)閉數(shù)據(jù)流對(duì)象

* 6.返回值,返回out對(duì)象的toByteArray(); 這個(gè)含義倍奢,我也不是太清楚

*/

public static byte[] serialize(IntWritable intw) throws IOException {

ByteArrayOutputStream out = new ByteArrayOutputStream();

DataOutputStream dataoutput = new DataOutputStream(out);

intw.write(dataoutput);

dataoutput.close();

return out.toByteArray();

}

/**

* 反序列化步驟

* 1.聲明一個(gè)靜態(tài)的類型時(shí)數(shù)組的函數(shù)朴上,并在里面?zhèn)鬟f參數(shù),而這個(gè)參數(shù)是Hadoop 里面InWritable 類的對(duì)象

* 2.使用Java.io包下的ByteArrayOutputStream 這個(gè)類并實(shí)例化卒煞,取名為in,即輸入對(duì)象痪宰,這里是從hdfs 上文件輸入到 本地,還起到把結(jié)構(gòu)化數(shù)據(jù)轉(zhuǎn)化為字符流

* 3.使用Java.io包下的DataIutputStream 類并實(shí)例化畔裕,取名為datain ,這里參數(shù)是in

* 4.調(diào)用InWritable 類的對(duì)像的readFields(); 顧名思義衣撬,要把hdfs上文件寫到本地

* 5.關(guān)閉數(shù)據(jù)流對(duì)象

* 6.返回值

*/

public static byte[] deserialize(IntWritable intw2, byte[] bytes) throws IOException {

ByteArrayInputStream in = new ByteArrayInputStream(bytes);

DataInputStream datain = new DataInputStream(in);

intw2.readFields(datain);

datain.close();

return bytes;

}

/* 使用Hadoop中的intwritable 類并實(shí)例化

* 聲明數(shù)組,并把inwritable 類對(duì)象intw 當(dāng)做參數(shù)傳給serialize

* 開始執(zhí)行序列化

*

*

*

* 使用Hadoop中的intwritable 類并實(shí)例化

* 聲明數(shù)組扮饶,并把inwritable 類對(duì)象intw 當(dāng)做參數(shù)傳給serialize

* 開始執(zhí)行反序列化

*

*

* */

public static void main(String[] args) throws IOException {

IntWritable intw = new IntWritable();

byte[] bytes = serialize(intw);

String bytes_str = StringUtils.byteToHexString(bytes);

System.out.println(bytes_str);

IntWritable intw2 = new IntWritable(0);

deserialize(intw2, bytes);

System.out.println(intw2);

}

}

個(gè)人小體會(huì):

????????????? 今天敲這寫代碼給我的感覺具练,在此之前,我也看了關(guān)于序列化相關(guān)知識(shí)甜无,但都是一臉懵逼的看扛点,一臉懵逼的不懂!就是之前學(xué)習(xí)完全沒用過腦子岂丘,就是比葫蘆畫瓢陵究,現(xiàn)在慢慢的懂了,是時(shí)間的積累元潘,也是經(jīng)驗(yàn)的增加畔乙,也反映出,知識(shí)這東西需要經(jīng)常溫習(xí)翩概,需要體會(huì)牲距。說不定哪一天都頓悟了呢,只要堅(jiān)持去學(xué)習(xí)钥庇,或早或晚都會(huì)有收獲的牍鞠,慢慢的發(fā)現(xiàn),這個(gè)序列化就是套路评姨,Hadoop 支持三個(gè)序列化难述,IntWritable萤晴、DoubleWritable和ByteWritable
這里我只是找了其中一個(gè),如若工作需要胁后,根據(jù)需要自行調(diào)整店读。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市攀芯,隨后出現(xiàn)的幾起案子屯断,更是在濱河造成了極大的恐慌,老刑警劉巖侣诺,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件殖演,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡年鸳,警方通過查閱死者的電腦和手機(jī)趴久,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搔确,“玉大人彼棍,你說我怎么就攤上這事⊥谆” “怎么了滥酥?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長畦幢。 經(jīng)常有香客問我,道長缆蝉,這世上最難降的妖魔是什么宇葱? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮刊头,結(jié)果婚禮上黍瞧,老公的妹妹穿的比我還像新娘。我一直安慰自己原杂,他們只是感情好印颤,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著穿肄,像睡著了一般年局。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咸产,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天矢否,我揣著相機(jī)與錄音,去河邊找鬼脑溢。 笑死僵朗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播验庙,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼顶吮,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了粪薛?” 一聲冷哼從身側(cè)響起云矫,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎汗菜,沒想到半個(gè)月后让禀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡陨界,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年巡揍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菌瘪。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腮敌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出俏扩,到底是詐尸還是另有隱情糜工,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布录淡,位于F島的核電站捌木,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嫉戚。R本人自食惡果不足惜刨裆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望彬檀。 院中可真熱鬧帆啃,春花似錦、人聲如沸窍帝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坤学。三九已至疯坤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拥峦,已是汗流浹背贴膘。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留略号,地道東北人刑峡。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓洋闽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親突梦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子诫舅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

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