一、做爲一種 持久化格式 。
二、做爲一種 通訊的數據格式 。三、做爲一種數據拷貝、克隆機制。php
Serializable
ObjectOutputStream.writeObject(序列化對象)
ObjectInputStream .readObject()返回序列化對象
http://blog.csdn.net/scgaliguodong123_/article/details/45938555java
但在hadoop的序列化機制中,用戶能夠複用對象,這樣就減小了java對象的分配和回收,提升了應用效率。python
Hadoop經過Writable
接口實現的序列化機制,不過沒有提供比較功能,因此和java中的Comparable
接口合併,提供一個接口WritableComparable
。(自定義比較)算法
Writable
接口提供兩個方法(write和readFields)。apache
xxxxxxxxxx
package org.apache.hadoop.io;public interface Writable {
void write(DataOutput out) throws IOException;
void readFields(DataInput in) throws IOException;
}
須要進行比較的話,要實現WritableComparable接口。編程
xxxxxxxxxx
public interface WritableComparable<T> extends Writable, Comparable<T>{}
http://blog.csdn.net/scgaliguodong123_/article/details/46010947api
WritableComparator 實現了 RawComparator<T> 繼承了
extends Comparator<T>數組
xxxxxxxxxx
package org.apache.hadoop.io;public interface RawComparator<T> extends Comparator<T> {
public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2);
}public class WritableComparator implements RawComparator {
private final Class<? extends WritableComparable> keyClass; private final WritableComparable key1; private final WritableComparable key2;
}
xxxxxxxxxx
org.apache.hadoop.io 接口WritableComparable<T>
父接口
Comparable<T>, Writable 基礎實現類
BooleanWritable, ByteWritable, ShortWritable,IntWritable,
VIntWritable,LongWritable, VLongWritable , FloatWritable, DoubleWritable高級實現類
MD5Hash, NullWritable,Text, BytesWritable,ObjectWritable,GenericWritable
僅實現了Writable接口的類服務器
org.apache.hadoop.io Interface(接口) WritableAll Known Subinterfaces(子接口):
Counter, CounterGroup, CounterGroupBase<T>, InputSplit, InputSplitWithLocationInfo, WritableComparable<T>
僅實現了Writable接口的類
數組:ArrayWritable、TwoDArrayWritable映射:AbstractMapWritable、MapWritable、SortedMapWritable
一、實現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中最稀缺的資源是寬帶,因此緊湊的序列化機制能夠充分的利用寬帶。
二、快速:通訊時大量使用序列化機制,所以,須要減小序列化和反序列化的開銷。
三、可擴展:隨着通訊協議的升級而可升級。
四、互操做:支持不一樣開發語言的通訊。
Hadoop1.x 序列化僅知足了緊湊和快速的特色。
序列化在分佈式環境的兩大做用:進程間通訊,永久存儲。
Hadoop節點間通訊。
Apache Avro
一、豐富的數據結構類型
二、快速可壓縮的二進制數據形式
三、存儲持久數據的文件容器
四、遠程過程調用RPC
五、簡單的動態語言結合功能,Avro和動態語言結合後,讀寫數據文件和使用RPC協議都不須要生成代碼,而代碼生成做爲一種可選的優化,只值得在靜態類型語言中實現。
Facebook Thrift
一、是一種可伸縮的跨語言服務的發展軟件框架。
二、它結合了功能強大的軟件堆棧的代碼生成引擎,以建設服務,工做效率和無縫地與C++,C#,.Java,Python和PHP和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博客