首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 服务器 > 云计算 >

自定义兑现Hadoop Key-Value

2013-03-10 
自定义实现Hadoop Key-Value自定义实现Value:如果需要自定义一个一个Value类型,那么需要实现Hadoop预定义

自定义实现Hadoop Key-Value

自定义实现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())方法完成该类对应比较程序的注册。

热点排行