Hadoop IO操作之序列化
前言:為什麽Hadoop基本類型還要定義序列化?
1、Hadoop在集群之間通信或者RPC調用時需要序列化,而且要求序列化要快,且體積要小,占用帶寬小。
2、java的序列化機制占用大量計算開銷,且序列化結構體積過大,它的引用機制也導致大文件不能被切分,浪費空間,此外,很難對其他語言進行擴展使用。
3、java 的反序列化過程每次都會構造新的對象,不能復用對象。
Hadoop定義了兩個序列化相關的接口
-Writable
-Comparable
WritableComparable接口相當於繼承了上述兩個接口的新接口。
Public interface WritableComparable<T> extends Writable,Comparable<T>
Writable接口
基於DataInput與DataOutput的簡單高效可序列化接口,就是org.apache.hadoop.io.Writable接口
幾乎所有的hadoop可序列化對象都必須實現這個接口有2個方法,Write,readFiles
下面以IntWritable為例,它把java的int類型封裝成了Writable序列化格式,並且可以通過set()設置它的值
-new IntWritable().set(100); -new IntWritable(100);
WritableComparable接口
類似java的Comparable接口,用於類型的比較。MR其中一個階段叫排序,默認使用Key來排序。Hadoop提供了一個優化接口RawComparator。
Public interface RawComparator<T> extends Comparator<T>{
Public int compare(byte[] b1,int s1,int l1,byte[] b2,int s2,int l2);
}
可以比較b1和b2,允許執行者直接比較數據流記錄,而無須先把數據流反序列化成對象,這樣可以避免新建對象的開銷
例子:
A implements Writable,comparable{ write(DataInputStream); DataInputStream readFiles(); comparaTo (B b){ // 二次排序Hadoop IO操作之序列化