操纵HBase数据库有如下几种方式:其一是使用hbase shell,其二是使用Java API,其三是通过MapReduce。另外HBase还提供了Avro,REST和Thrift接口,不过一般用的较少。
在《HBase操作》和[《如何用MapReduce程序操作》]hbase(http://blog.csdn.net/liuyuan185442111/article/details/45306193)中已有部分描述。下面对MapReduce操纵HBase做一个总结。
org.apache.hadoop.hbase.mapreduce包中的类和工具有利于将HBase作为MapReduce作业的源/输出。
源
TableInputFormat类将数据表按照region分割成 split,既有多少个regions就有多个splits。然后将region按行键分成<key,value>对,key值对应于行健,value值为该行所包含的数据。
org.apache.hadoop.hbase.mapreduce.TableInputFormat
继承自
org.apache.hadoop.hbase.mapreduce.TableInputFormatBase
后者又继承自
org.apache.hadoop.mapreduce.InputFormat<ImmutableBytesWritable,Result>
org.apache.hadoop.hbase.mapreduce.TableMapper<KEYOUT,VALUEOUT>
继承自
org.apache.hadoop.mapreduce.Mapper<ImmutableBytesWritable,Result,KEYOUT,VALUEOUT>
不过<KEYIN,KEYOUT>被固定为<ImmutableBytesWritable,Result>
(org.apache.hadoop.hbase.io.ImmutableBytesWritable)
(org.apache.hadoop.hbase.client.Result)
Mapper的map函数的前两个参数也被固定:
public void map(ImmutableBytesWritable, Result, Context);
如果Mapper需要从HBase中读取数据,可继承TableMapper,然后调用TableMapReduceUtil.initTableMapperJob()来初始化。
使用Mapper读HBase的时候,需传入一个Scan类型的参数,用来确定startRow,stopRow,filter等属性。如:
Scan scan = new Scan();
scan.addFamily(Bytes.toBytes("cfname"));
byte[] startRow = Bytes.toBytes("2011010100000");
byte[] stopRow = Bytes.toBytes("2011010200000");
// 设置开始和结束key
scan.setStartRow(startRow);
scan.setStopRow(stopRow);
TableMapReduceUtil.initTableMapperJob("tablename", scan,
Mapper.class, KEYOUT.class, VALUEOUT.class, job);
输出
TableOutputFormat把Reducer的结果写入HBase。
org.apache.hadoop.hbase.mapreduce.TableReducer<KEYIN,VALUEIN,KEYOUT>
继承自
org.apache.hadoop.mapreduce.Reducer<KEYIN,VALUEIN,KEYOUT,Mutation>
不过VALUEOUT被固定为org.apache.hadoop.hbase.client.Mutation
Reducer的reduce函数的前两个参数也被固定:
public void reduce(KEYIN key, Iterable<VALUEIN> values, Context context);
Mutation的直接派生类有Append, Delete, Increment, Put
是以在reduce函数中调用context.write()时, 其第一个参数可以为null(并没有用到这个参数), 第二个参数可以为Put或Delete
如果Reducer需要向HBase中写入数据,可继承TableReducer类,然后调用TableMapReduceUtil.initTableReducerJob()来初始化。
org.apache.hadoop.hbase.mapreduce.IdentityTableReducer继承自TableReducer,Convenience class that simply writes all values (which must be Put or Delete instances) passed to it out to the configured HBase table,传给IdentityTableReducer的KEY无所谓,VALUE必须是Put或Delete类型。
同时调用setNumReduceTasks函数将Reducer数目设置为0,即可实现在Mapper中写HBase数据库。
Put,Delete,Scan,Result均位于org.apache.hadoop.hbase.client中。