Hadoop--MapReduce_Hadoop序列化
目錄
- 序列化概述
- 什么是序列化
- 為什么要序列化
- 為什么不使用Java的序列化
- 自定義bean對象實現(xiàn)序列化接口(Writable)
- 實現(xiàn)bean對象序列化步驟
序列化概述
什么是序列化
序列化就是把內(nèi)存中的對象,轉(zhuǎn)換成字節(jié)序列(或其他數(shù)據(jù)傳輸協(xié)議)以便于存儲到磁盤(持久化)和網(wǎng)絡(luò)傳輸。
反序列化就是將收到的字節(jié)序列(或其他數(shù)據(jù)傳輸協(xié)議)或者是磁盤的持久化數(shù)據(jù),轉(zhuǎn)換成內(nèi)存中對象。
為什么要序列化
一般來說,“活的”對象只生存在內(nèi)存里,關(guān)機(jī)斷電就沒有了。而且“活的”對象只能由本地的進(jìn)程使用,不能被發(fā)送到網(wǎng)絡(luò)上的另外一臺計算機(jī)。然而序列化可以存儲“活的”對象,可以將“活的”對象發(fā)送到遠(yuǎn)程計算機(jī)。
為什么不使用Java的序列化
java的序列化是一個重量級序列化框架(Serializable),一個對象被序列化后,會s附帶很多額外的信息(各種校驗信息,Header,繼承體系等),不便于在網(wǎng)絡(luò)中高效傳輸。
而hadoop序列化具有以下優(yōu)點:
緊湊:高效使用存儲空間;
快速:讀寫數(shù)據(jù)的額外開銷小;
可擴(kuò)展:隨著通信協(xié)議的升級可升級;
互操作性:支持多語言的交互。
自定義bean對象實現(xiàn)序列化接口(Writable)
在企業(yè)開發(fā)中往往常用的基本序列化類型不能滿足所有需求,比如在hadoop框架內(nèi)部傳遞一個bean對象,那么該對象就需要實現(xiàn)序列化接口。
實現(xiàn)bean對象序列化步驟
1.必須實現(xiàn)Writable接口;
2.反序列化時,需要反射調(diào)用空參構(gòu)造函數(shù),所以必須有空參構(gòu)造:
public FlowBean(){super(); }3.重寫序列化方法
@Overridepublic void write(DataOutput out) throws IOException {out.writeLong(upFlow);out.writeLong(downFlow);out.writeLong(sumFlow);}4.重寫反序列化方法
@Overridepublic void readFields(DataInput in) throws IOException {this.upFlow = in.readLong();this.downFlow = in.readLong();this.sumFlow = in.readLong();}5.注意反序列化的順序和序列化的順序完全一致;
6.要想把結(jié)果顯示在文件中,需要重寫toString()(默認(rèn)傳輸?shù)氖堑刂分?, 可用"\t"分開,方便后續(xù)使用;
7.如果需要將自定義的bean放在key中傳輸,還需要實現(xiàn)Comparable接口,因為MapReduce框架中的Shuffle過程要求對key必須能排序;
@Override public int comparaTo(FlowBean o){//從大到小倒序排列return this.sumFlow > o.getSumFlow() ? -1 : 1; }總結(jié)
以上是生活随笔為你收集整理的Hadoop--MapReduce_Hadoop序列化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows下LATEX排版论文攻略—
- 下一篇: 【技术贴】解决 myeclipse打不开