第一次写Blog。


数据库(NoSql),现在想使用Hadoop对数据库的数据进行处理,涉及到数据库的连接,及相关的CRUD操作。所以,要实现一个Hadoop的连接器。

类似于Mongodb,连接到数据库,需要先得到数据库对象db,然后得到数据库的collectionSpace,再得到collection,然后,就可以进行数据的读取与写入操作。元数据都是用BSON/JSON结构。


下面进入Hadoop连接器的实现。


首先,使用了Apache下的开源的BSONWritable和BSONComparator两个类,包装成为Hadoop支持的数据结构。


包含了一下几个类文件:*Configuration.java,*InputFormat.java,*InputSplit.java,*RecordReader.java,*OutputFormat.java,*OutputCommiter.java,*RecordWriter.java。

*Configuration.java:

进行Hadoop的Configuration的相关设置,在这里,我们可以设置读入和输出的数据库连接地址(<IP:Port>)、读入和输出的CollectionSpace和Collection的名字、数据库的用户名和密码、查询条件的设置等等。


*InputFormat.java(extends InputFormat< , >):
如果想连接NoSql需要在写Map/Reduce程序时进行设置此类,job.setInputFormatClass(*InputFormat.class)进行设置。
主要重写两个方法:
public RecordReader<> createRecordReader(InputSplit split, TaskAttemptContext context){}



第一个方法是通过Split得到与之对应的RecordReader,进行数据的读取。

第二个方法是得到collection的splits(即collection都分布在哪几个节点上,与Mapper一一对应),并返回。


*InputSplit.java(extends InputSplit implements Writable):

对数据库的collection里的数据按所在节点位置进行分片。

一定要有个默认的构造函数,Hadoop需要调用。

包括hostname和port两个域,主要实现readFields(DataInput input)和write(DataOutput out)两个方法,因为,hadoop会将split的信息先存入hdfs里,然后,再实例化split的时候,再从hdfs中读取相应的信息。


*RecordReader.java:

进行数据库的读取操作。

initialize(...)方法:通过Split信息来连接数据库,并得到结果集游标。

getCurrentKey()和getCurrentValue()方法:得到当前的key和value。

nextKeyValue()方法:得到下一条记录。


*OutputFormat.java:

需要在写Map/Reduce程序时进行设置此类,job.setOutputFormatClass(*OutputFormat.class)进行设置。

checkOutputSpecs(JobContext context)()方法:

主要负责Job真正运行之前的文件检查操作,如检查输出文件是否存在等。

getRecordWriter(...)方法:

得到*RecordWriter对象。


*RecordWriter.java:

进行数据库的写操作。

构造函数:得到一个collection实例,进行写操作。

write(K key, V value)方法:写入数据库一个键值对。