快乐学习 一个网站喵查铺子(catpuzi.com)全搞定~

Hbase实现表的数据迁移

大数据 数据帝 2020-02-27 扫描二维码

在Hbase中因为没有像关系型数据库那样可以直接用sql进行表间的数据迁移。因此,我们采用MapReduce来处理下量表间的数据迁移。

首先,我们在Hbase shell中先创建一张测试表tab1,往里面插入两条测试数据,rowkey分别为rk00,rk00001。然后,我们也新建另外一张表tab2,列簇跟tab1一样。接下来,编写MapReduce将tab1中的数据导入到tab2中。
在Hbase中,它的map是继承TableMap类,我们只需指定输出的key-value。因为,我们是要往tab2中插入数据,reducer中输出的类型应该是Put类型,所以,Map中传出类型也应该改为Put.。其实,从Hbase的jar包里面看TableReducer这个类,它输出类型制定为Mutation,而Mutation就包含了我们在Hbase shell中的基本操作Put,Delete等。

Hbase实现表的数据迁移

我们的TableMapper应该编写如下,

public static class TabMapper extends TableMapper<Text, Put> {
private Text rowkey = new Text();
@Override
protected void map(ImmutableBytesWritable key, Result value,Context context) throws IOException, InterruptedException {
byte[] bytes = key.get();
rowkey.set(Bytes.toString(bytes));
Put put = new Put(bytes);
for (Cell cell : value.rawCells()) {
// add cell
if(“info”.equals(Bytes.toString(CellUtil.cloneFamily(cell)))) {
if(“name”.equals(Bytes.toString(CellUtil.cloneQualifier(cell)))) {
put.add(cell);
}
}
}
接下来,来看run方法,这里面主要是map跟reduce的调用,也是核心。在Hbase中,有一个类TableMapReduceUtil.initTableMapperJob,这个里面包含了Map的初始化,包含了要读取的表,表的数据扫描,在数据的扫描时候,我们可以对缓存进行优化。

 

Scan scan = new Scan();
scan.setCaching(500);
scan.setCacheBlocks(false);
// set mapper
TableMapReduceUtil.initTableMapperJob(
“tab1”, // input table
scan , // scan instance
TabMapper.class,  // set mapper class
Text.class, // mapper output key
Put.class, //mapper output value
job // set job
);

最后,将代码打成jar包上传到服务器上,使用环境变量的方式运行。
HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase classpath` ${HADOOP_HOME}/bin/hadoop jar Hbase.jar
我们可以看到,tab2中导入了tab1中的数据。

Hbase实现表的数据迁移

 

喜欢 (0)
关于作者: