对HBase数据库的操纵(MapReduce)

操纵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中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值