hadoop技術內幕-序列化與壓縮(一)

一、java內建序列化機制

  java序列化機制將對象轉換爲連續的byte數據,這些數據可以在日後還原爲原先的對象狀態,還能自動處理不同操作系統上的差異,也不用擔心字節排列次序。

  java的類實例可被序列化只要在類聲明中加入implements Serializable即可。Serializable接口是一個標誌,不具有任何成員函數。

  java的序列化會自動訪問對象的父類,以保證對象內容的一致性。序列化的結果中包含了大量與類相關的信息(包括版本號、類描述信息、類的版本ID、父類等)。在這個過程中序列化輸出中保存了大量的附加信息,導致序列化結果膨脹

二、Hadoop序列化機制

  hadoop序列化機制通過調用對象的write()方法,將對象序列化到流中。反序列化是通過對象的readFields(),從流中讀取數據。java序列化機制中,反序列化過程會不斷地創建新的對象,但在Hadoop的序列化機制的反序列化過程中,用戶可以複用對象

  hadoop序列化機制特點:緊湊、快速、可擴展、互操作。java序列化機制中,java Serialization會將每個對象的類名寫入輸出流中,這導致了java序列化對象需要佔用比原來對象更多的存儲空間。同時爲了減少數據量,同一個類的對象的序列化結果只輸出一份元數據,並通過某種形式的引用來共享元數據。

  hadoop引入了org.apache.hadoop.io.writable接口,作爲所有可序列化對象必須實現的接口,Writable機制緊湊、快速。和java.io.Serializable不同,Writable接口不是一個說明性接口。此外,hadoop序列化機制中還包含另外幾個重要接口:WritableComparable、RawComparator和WritableComparator。

  大部分的MapReduce程序都是使用Writable鍵-值對作爲輸入和輸出,但這並不是hadoop的API指定的。其它的序列化機制也能和hadoop配合,並應用於mapreduce中。除了java序列化機制和hadoop的writable機制,還流行其它序列化框架,如:hadoop avro、apache thrift和google protocol buffer。Hadoop提供了一個簡單的序列化框架API,用於集成各種序列化實現,該框架由serialization實現。hadoop目前支持兩個serialization實現,分別支持writable機制的WritableSerialization和支持java序列化的javaSerialization。通過javaSerialization可以在MapReduce程序中方便地使用標準的java類型,但java的Object Serialization不如Hadoop的序列化機制有效,非特殊情況不要輕易嘗試。

 

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