MapReduce的序列化

1. 概述
序列化(Serialization)是指把結構化對象轉化爲字節流。
反序列化(Deserialization)是序列化的逆過程。把字節流轉爲結構化對象。
當要在進程間傳遞對象或持久化對象的時候,就需要序列化對象成字節流,反之當要將接收到或從磁盤讀取的字節流轉換爲對象,就要進行反序列化。
Java的序列化(Serializable)是一個重量級序列化框架,一個對象被序列化後,會附帶很多額外的信息(各種校驗信息,header,繼承體系…),不便於在網絡中高效傳輸;所以,hadoop自己開發了一套序列化機制(Writable),精簡,高效。不用像java對象類一樣傳輸多層的父子關係,需要哪個屬性就傳輸哪個屬性值,大大的減少網絡傳輸的開銷。
Writable是Hadoop的序列化格式,hadoop定義了這樣一個Writable接口。
一個類要支持可序列化只需實現這個接口即可。

  1. public interface Writable {
  2. void write(DataOutput out) throws IOException;
  3. void readFields(DataInput in) throws IOException;
  4. }
    2. Writable序列化接口
    如需要將自定義的bean放在key中傳輸,則還需要實現comparable接口,因爲mapreduce框中的shuffle過程一定會對key進行排序,此時,自定義的bean實現的接口應該是:
    public class FlowBean implements WritableComparable<FlowBean>
    需要自己實現的方法是:
/**

 * 反序列化的方法,反序列化時,從流中讀取到的各個字段的順序應該與序列化時寫出去的順序保持一致

 */

@Override

public void readFields(DataInput in) throws IOException {

upflow = in.readLong();

dflow = in.readLong();

sumflow = in.readLong();

}

/**

 * 序列化的方法

 */

@Override

public void write(DataOutput out) throws IOException {

out.writeLong(upflow);

out.writeLong(dflow);

out.writeLong(sumflow);

}

@Override

public int compareTo(FlowBean o) {

//實現按照sumflow的大小倒序排序

return sumflow>o.getSumflow()?-1:1;

}

compareTo方法用於將當前對象與方法的參數進行比較。
如果指定的數與參數相等返回0。
如果指定的數小於參數返回 -1。
如果指定的數大於參數返回 1。
例如:o1.compareTo(o2);
返回正數的話,當前對象(調用compareTo方法的對象o1)要排在比較對象(compareTo傳參對象o2)後面,返回負數的話,放在前面。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章