自定義實現Value:
如果需要自定義一個一個Value類型,那麼需要實現Hadoop預定義接口org.apache.hadoop.io.Writable。Writable包含兩個重要的方法:readFields和write,主要用於數據的序列化和反序列化。對於Writable的子類的成員變量必須是Java的基本類型或者是其他實現了Writable接口的類型。如果是Java的基本類型則可以使用DataInput的相應方法進行成員變量的讀寫,例如:
int responseSize = in.readInt();
String userIP = in.readUTF();
如果是實現了Writable接口的類型可以使用該類型的write和readFields方法進行數據的讀寫,例如:
Text name=new Text();
name.readFields(in);
注意事項:
(1)如果過實現接口Writable的自定義類型包含構造函數,一定需要書寫參數為空的自定義函數(2)如果Hadoop應用采用了TextOutputFormat作為輸出格式並且采用了自定義Key或者Value,因為TextOutputFormat采用value的toString方法進行最後結果的輸出,因此在自定義Writable的時候需要根據需要實現一個有意義的toString方法(3)當Hadoop進行輸入處理的時候,Hadoop一般會重復使用key或value對象,主要注意上一次讀取的數據會不會對本次處理產生影響。
自定義實現Key:
作為Hadoop Key,需要具備比較功能,以便hadoop進行分區和排序。因此,Key需要實現兩個接口,一個是Writable接口;一個是WritableComparable接口。WritableComparable增加了一個compareTo方法,用來進行對象的比較。
注意事項:
一般情況下采用compareTo方法就能滿足應用需求,但是該方法需要將二進制數據反序列化成對象,因此性能不是特別高。為此,Hadoop一般為每一種Writable類型提供一種RawComparator,用來進行二進制數據的比較。如果需要使用RawComparator,則首先需要繼承WritableComparator並自定義實現其中的compare方法;然後,通過 WritableComparator.define(IntWritable.class, new Comparator())方法完成該類對應比較程序的注冊。
更多Hadoop相關信息見Hadoop 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=13