hadoop學習筆記(十一):MapReduce數據類型
一、序列化
1 hadoop自定義了數據類型,在hadoop中,所有的key/value類型必須實現Writable接口。有兩個方法,一個是write,一個是readFileds。分別用於讀(反序列化操作)和寫(序列化操作)。
2 所有的key必須實現Comparable接口,在MapReduce過程中需要對key/value對進行反復的排序,默認情況下依據key進行排序,要實現compareTo()方法,所以通過key既要實現Writable接口又要實現Comparable接口。
3 因此,hadoop中提供了一個公共的接口WritableComparable接口,這個接口繼承了Writable和Comaprable接口。
4 由於需要序列化和反序列化和比較,需要對java對象重寫一下幾個方法:
1、equlas()方法。
2、hashcode()方法。
3、toString()方法。
4、數據類型必須有一個默認的無參的構造方法,為了方便反射,進行創建對象。
序列化的概念:
所謂序列化(serialization),是指將結構化對象轉化為字節流,以便在網絡上傳輸或寫到磁盤進行永久存儲。
在分布式數據裏的兩大領域裏,序列化經常出現,進程間通信和永久存儲。
在hadoop中,系統多個節點上進程間的通信是通過“遠程過程調用”(remote procedure call,RPC)實現的。RPC協議將消息序列化
hadoop使用自己的序列化格式(Writable),它格式緊湊、速度快,但很難用Java以外的語言進行擴展或使用。因為Writable是hadoop核心(大多數MapReduce程序都會以鍵和值使用它)。
反序列化的概念:
反序列化是指將字節流轉回結構化對象的過程。
二、數據類型
數據類型都實現了Writable接口,以便用這些類型定義的數據可以被序列化進行網絡傳輸和文件存儲。
基本數據類型:
Java基本數據類型 | 名稱 | 類型 | 序列化大小 |
boolean | BooleanWritable | 標準布爾類型數值 | 1 |
byte | ByteWritable | 單字節數值 | 1 |
double | DoubleWritable | 雙字節數值 | 8 |
float | FloatWritable | 浮點數 | 4 |
int | IntWritable | 整型數 | 4 |
VintWritable | 可變長度整型數 | 1~5 | |
long | LongWritable | 長整型數 | 8 |
VlongWritable | 可變長度長整型數 | 1~9 | |
Text | 使用UTF-8格式存儲文本 | ||
NullWritable | 當<key,value>中的key或value為空時使用 |
註意:在自定義數據類型中,建議使用java原生的數據類型,最好不要使用hadoop封裝的數據類型。
三、比較器(Comparable)
當數據寫入磁盤時,如果要進行排序的話, 需要首先從磁盤讀取數據,進行反序列化成對象,然後在內存中對反序列化的對象進行比較。為什麽不直接在內存中就直接進行比較呢?
如果要實現上述功能,hadoop數據類型需要實現一個接口RawComparator接口。
RawComarator
對MapReduce來說,類型的比較是非常重要的,因為中間有一個基於鍵的排序階段。hadoop提供的一個優化接口是繼承自Java Comparator的RawComparator接口。
該接口允許其實現直接比較數據流中的記錄,無須先把數據反序列化為對象,這樣便避免了新建對象的額外開銷。例如,我們根據IntWritable接口實現的comparator實現了comare()方法,該方法可以從每個字節數組b1和b2中讀取給定起始位置(s1和s2)以及長度(l1和l2)的一個整數進而直接進行比較。
WritableComarator是對繼承自WritableComparable類的RawComaparator類的一個通用實現,它提供兩個主要功能。
第一、它提供了對原始compare()方法的一個默認實現,該方法能夠反序列化在流中進行比較的對象,並調用對象的compare()方法。
第二、它充當的是RawComparator實例的工廠(已註冊Writable的實現)。例如,為了獲得IntWritable的comparator,我們直接如下調用:
這個comparator可以用於比較兩個IntWritable對象;
或其序列化表示:
hadoop學習筆記(十一):MapReduce數據類型