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