Hadoop序列化機制及實例

序列化


一、什麼是序列化?
將結構化對象轉換成字節流以便於進行網絡傳輸或寫入持久存儲的過程。
二、什麼是反序列化?
將字節流轉換爲一系列結構化對象的過程。
序列化 用途
一、做爲一種 持久化格式 。 
二、做爲一種
通訊的數據格式 。 

三、做爲一種數據拷貝、克隆機制。php


Java序列化和反序列化

一、建立一個對象實現了 Serializable  
二、序列化    : ObjectOutputStream.writeObject(序列化對象)  
      反序列化: ObjectInputStream .readObject()返回序列化對象  
具體實現,可參考以下文章: 

http://blog.csdn.net/scgaliguodong123_/article/details/45938555java

爲何Hadoop不直接使用java序列化?

Hadoop 的序列化機制與 Java 的序列化機制不一樣,它將對象序列化到流中,
值得一提的是java的序列化機制是不斷的建立對象,

但在hadoop的序列化機制中,用戶能夠複用對象,這樣就減小了java對象的分配和回收,提升了應用效率。python

Hadoop序列化

Hadoop的序列化不採用java的序列化,而是實現了本身的序列化機制。 

Hadoop經過Writable接口實現的序列化機制,不過沒有提供比較功能,因此和java中的Comparable接口合併,提供一個接口WritableComparable。(自定義比較)算法

Writable接口提供兩個方法(write和readFields)。apache

須要進行比較的話,要實現WritableComparable接口。編程

好比mapreduce中須要對key值進行相應的排序。可參考下面的例子:  

http://blog.csdn.net/scgaliguodong123_/article/details/46010947api


Hadoop提供了幾個重要的序列化接口與實現類:

外部集合的比較器

WritableComparator 實現了 RawComparator<T> 繼承了 extends Comparator<T>數組

 


實現了WritableComparable接口的類(自定義比較)

僅實現了Writable接口的類服務器



自定義Writable

一、實現WritableComparable接口 
二、實現相應的接口方法: 
網絡

A. write(dos)             //將對象轉換爲字節流並寫入到輸出流out中。 

B. readFileds()     //從輸入流in中讀取字節流併發序列化爲對象。 

C. compareTo(o) //將this對象和對象o進行比較。 

可參考下面的例子,自定義NewK2類: 
http://blog.csdn.net/scgaliguodong123_/article/details/46010947

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  public  static  void  main(String[] args)  throws  IOException {        
         Student student =  new  Student( "liguodong" 22 "男" );
         BufferedOutputStream bos =  new  BufferedOutputStream( new  FileOutputStream( new  File( "g:/liguodong.txt" )));
         DataOutputStream dos =  new  DataOutputStream(bos);        
         student.write(dos);        
         dos.flush();        
         dos.close();        
         bos.close();        
         
         Student student2 =  new  Student();
         BufferedInputStream bis =  new  BufferedInputStream( new  FileInputStream( new  File( "g:/liguodong.txt" )));
         DataInputStream dis =  new  DataInputStream(bis);        
         student2.readFields(dis);
         System.out.println( "name=" +student2.getName()
                 + ",age=" +student2.getAge()+ ",sex=" +student2.getSex()); // 打印:name=liguodong,age=22,sex=男
}
  
// 省略
//Hadoop序列化機制及實例 - 琴絃上、漫步 - CSDN博客
//http://blog.csdn.net/scgaliguodong123_/article/details/46385761#t3

Hadoop序列化優點:

一、緊湊:Hadoop中最稀缺的資源是寬帶,因此緊湊的序列化機制能夠充分的利用寬帶。 
二、快速:通訊時大量使用序列化機制,所以,須要減小序列化和反序列化的開銷。 
三、可擴展:隨着通訊協議的升級而可升級。 
四、互操做:支持不一樣開發語言的通訊。 
Hadoop1.x 序列化僅知足了緊湊和快速的特色。

Hadoop序列化的做用

序列化在分佈式環境的兩大做用:進程間通訊,永久存儲。 
Hadoop節點間通訊。

序列化框架

Apache Avro

一、豐富數據結構類型 
二、快速可壓縮二進制數據形式 
三、存儲持久數據的文件容器 
四、遠程過程調用RPC 
五、簡單的動態語言結合功能,Avro和動態語言結合後,讀寫數據文件和使用RPC協議都不須要生成代碼,而代碼生成做爲一種可選的優化,只值得在靜態類型語言中實現。

Facebook Thrift 

一、是一種可伸縮的跨語言服務的發展軟件框架 
二、它結合了功能強大的軟件堆棧的代碼生成引擎,以建設服務,工做效率和無縫地與C++,C#,.Java,PythonPHP和Ruby結合。 
三、容許定義一個簡單的定義文件中的數據類型和服務接口,以做爲輸入文件,編譯器生成代碼用來方便地生成RPC客戶端和服務器通訊的無縫跨編程語言

Google Protocolbuffer  

PB是Google開源的一種輕量級的結構化數據存儲格式,能夠用於結構化數據的序 
列化與反序列化,很適合作數據存儲RPC數據交換格式 

優勢: 
與 XML相比,它更小、更快、也更簡單。你能夠定義本身的數據結構,而後使用代碼生成器生成的代碼來讀寫這個數據結構。你甚至能夠在無需從新部署程序的狀況下更新數據結構。只需使用 Protobuf 對數據結構進行一次描述,便可利用各類不一樣語言或從各類不一樣數據流中對你的結構化數據輕鬆讀寫。

它有一個很是棒的特性,即「向後」兼容性好,人們沒必要破壞已部署的、依靠」老」數據格式的程序就能夠對數據結構進行升級。這樣您的程序就能夠沒必要擔憂由於消息結構的改變而形成的大規模的代碼重構或者遷移的問題。由於添加新的消息中的 field 並不會引發已經發布的程序的任何改變

Protocolbuffer語義更清晰無需相似 XML 解析器的東西(由於 Protobuf 編譯器會將 .proto 文件編譯生成對應的數據訪問類以對 Protobuf 數據進行序列化、反序列化操做)。使用 Protobuf 無需學習複雜的文檔對象模型,Protobuf 的編程模式比較友好,簡單易學,同時它擁有良好的文檔和示例,對於喜歡簡單事物的人們而言,Protobuf 比其餘的技術更加有吸引力。

不足: 
Protbuf 與 XML 相比也有不足之處。它功能簡單,沒法用來表示複雜的概念

因爲文本並不適合用來描述數據結構,因此 Protobuf 也不適合用來對基於文本的標記文檔(如 HTML)建模。另外,因爲 XML 具備某種程度上的自解釋性,它能夠被人直接讀取編輯,在這一點上 Protobuf 不行,它以二進制的方式存儲,除非你有 .proto 定義,不然你無法直接讀出 Protobuf 的任何內容。

Hadoop2.X用到的Protocolbuffer 
hadoop-2.6.0-src/hadoop-hdfs-project/hadoop-hdfs/src/main/proto



參考

Hadoop序列化機制及實例 - 琴絃上、漫步 - CSDN博客

http://blog.csdn.net/scgaliguodong123_/article/details/46385761#t3


hadoop深刻研究:(十三)——序列化框架 - 獨自登高樓 望斷天涯路 - CSDN博客

http://blog.csdn.net/lastsweetop/article/details/9376495

相關文章
相關標籤/搜索