1. 程式人生 > >Hadoop IO操作之序列化

Hadoop IO操作之序列化

數據 new 前言 一個 就是 clas 之間 其中 ava

前言:為什麽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){ // 二次排序
if(b.x > a.x) } equals(); hascode(); } A實現了上述兩種接口,就可以作為hadoop的類.

Hadoop IO操作之序列化