Java 和 Hadoop 序列化機制淺講

來源:互聯網
上載者:User

標籤:序列化   serializable   writable   hadoop序列化   

1.序列化

序列化 (Serialization)將對象的狀態資訊轉換為可以儲存或傳輸的形式的過程(位元組流)。在序列化期間,對象將其目前狀態寫入到臨時或持久性儲存區。以後,可以通過從儲存區中讀取或還原序列化對象的狀態,重新建立該對象。

通常來說有三個用途:

  • 持久化:對象可以被儲存到磁碟上
  • 通訊:對象可以通過網路進行傳輸
  • 拷貝、複製:可以通過將某一對象序列化到記憶體的緩衝區,然後通過還原序列化產生該對象的一個深拷貝(破解單例模式的一種方法)

2.Java序列化機制在Java中要實現序列化,只需要實現Serializable即可(說是實現,其實不需要實現任何成員方法)。
public interface Serializable {}
如果想對某個對象進行序列化的操作,只需要在OutputStream對象上建立一個輸入資料流 ObjectOutputStream 對象,然後調用 writeObject()。在序列化過程中,對象的類、類簽名、雷瑟所有非暫態和非靜態成員變數的值,以及它所有的父類都會被寫入。
Date d = new Date();OutputStream out = new ByteArrayOutputStream();ObjectOutputStream objOut = new ObjectOutputStream(out);objOut.writeObject(d);
如果想對某個基本類型進行序列化,ObjectOutputStream 還提供了多種 writeBoolean、writeByte等方法反序列過程類似,只需要調用 ObjectInputStream 的 readObject() ,並向下轉型,就可以得到正確結果。 優點:實現簡便,對於循環參考和重複引用的情況也能處理,允許一定程度上的類成員改變。支援加密,驗證。 缺點:序列化後的對象佔用空間過大,資料膨脹。反序列會不斷建立新的對象。同一個類的對象的序列化結果只輸出一份中繼資料(描述類別關係),導致了檔案不能分割。3.Hadoop序列化機制對於需要儲存和處理大規模資料的Hadoop來說,其序列化機制要達到以下目的:
  • 排列緊湊:盡量減少頻寬,加快資料交換速度
  • 處理快速:處理序間通訊需要大量的資料互動,使用大量的序列化機制,必須減少序列化和反序列的開支
  • 跨語言:可以支援不同語言間的資料互動啊,如C++
  • 可擴充:當系統協議升級,類定義發生變化,序列化機制需要支援這些升級和變化
為了支援以上特性,引用了Writable介面。和說明性Serializable介面不一樣,它要求實現兩個方法。
public interface Writable {  void write(DataOutput out) throws IOException;  void readFields(DataInput in) throws IOException;}
比如,我們需要實現一個表示某一時間段的類,就可以這樣寫
public class StartEndDate implements Writable{private Date startDate;private Date endDate;@Overridepublic void write(DataOutput out) throws IOException {out.writeLong(startDate.getTime());out.writeLong(endDate.getTime());}@Overridepublic void readFields(DataInput in) throws IOException {startDate = new Date(in.readLong());endDate = new Date(in.readLong());}public Date getStartDate() {return startDate;}public void setStartDate(Date startDate) {this.startDate = startDate;}}

Hadoop 還提供了另外幾個重要的介面: WritableComparable:它不僅提供序列化功能,而且還提供比較的功能。這種比較式基於反序列後的對象成員的值,速度較慢。 RawComparator:由於MapReduce十分依賴基於鍵的比較排序(自訂鍵還需要重寫hashCode和equals方法),因此提供了一個最佳化介面 RawComparator。該介面允許直接比較資料流中的記錄,無需把資料流還原序列化為對象,這樣避免了建立對象的額外開銷。RawComparator定義如下,compare方法可以從每個位元組數組b1和b2中讀取給定起始位置(s1和s2)以及長度l1和l2的一個整數直接進行比較。
public interface RawComparator<T> extends Comparator<T> {  public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2);}

WritableComparator: 是 RawComparator 的一個通用實現,提供兩個功能:提供了一個 RawComparator的comparea()的預設實現,該預設實現只是還原序列化了鍵然後再比較,沒有什麼效能優勢。其次、充當了 RawComaprator 執行個體的一個Factory 方法。當我們要實現自定key排序時(自訂分組),需要指定自己的定序。如需要以StartEndDate為鍵且以開始時間分組,則需要自訂分組器:
class MyGrouper implements RawComparator<StartEndDate> {    @Override    public int compare(StartEndDate o1, StartEndDate o2) {        return (int)(o1.getStartDate().getTime()- o2.getEndDate().getTime());    }    @Override    public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {        int compareBytes = WritableComparator.compareBytes(b1, s1, 8, b2, s2, 8);        return compareBytes;    }     }
然後在job中設定 job.setGroupingComparatorClass(MyGrouper.class);
最好將equals和hashcode也進行重寫:
@Overridepublic boolean equals(Object obj) {if(!(obj instanceof StartEndDate))return false;StartEndDate s = (StartEndDate)obj;return startDate.getTime()== s.startDate.getTime()&&endDate.getTime() == s.endDate.getTime(); }@Overridepublic int hashCode() {int result = 17;  //任意素數   result = 31*result +startDate.hashCode();  result = 31*result +endDate.hashCode();   return result;};

ps: equal 和 hashcode 方法中應該還要對成員變數判空,以後還需要修改。

參考資料:《Hadoop權威指南》《Hadoop技術內幕》正確重寫hashCode的方法 -http://blog.sina.com.cn/s/blog_700aa8830101jtlf.htmlMapReduce自訂分組 -http://www.luoliang.me/index.php/archives/ProgrammingLanguage/56.html

Java 和 Hadoop 序列化機制淺講

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.