HBase数据导入方法总结(续)


引言

本文将接着上一篇博文继续介绍剩下的几种HBase数据导入方法。分别是:

  • MapReduce Job(TableReducer)
  • Importtsv(unbulk load)
  • bulk load(Importtsv | MapReduce Job)
  • Sqoop

下面依次介绍这些方法:

1.MapReduce Job(TableReducer)

借助编程MapReduce Job进行HBase数据导入的方法有很多,本文只简单介绍其中一种方法。步骤如下:

  • 编写JDBC接口将数据从关系型数据库中导出到本地,格式:一行对应表的一条record
  • 将本地文件导入到HDFS
  • 编写MapReducer Job,Reduce类继承TableReducer,实现HBase数据导入

步骤1上一篇博文中已经给出示范代码,只需要实现数据按照固定格式写入本地即可,这里就不赘述了。
步骤2只需要一条HDFS命令行指令即可:~$hadoop fs -put sourcePath targetPath
步骤3需要自行编写MapReduce程序。例如:

public static class Reduce extends TableReducer<LongWritable,Text,ImmutableBytesWritable>{
    @Override
    protected void reduce(LongWritable key, Iterable<Text> values,Context context){
        //设计对values的处理逻辑
        Put put=new Put(rowKey);
        .....
        //输出
        context.write(new ImmutableBytesWritable(rowKey),put);
    }
}

有关map类和main函数的设计,可以自己根据问题自行设计,此处就不赘述了。

2.Importtsv(unbulk load)

ImportTsv是HBase提供的一个数据导入工具,功能是实现将tsv( tab-separated values)格式的数据导入到HBase中。它有两种用法:

  1. 通过Put将存放在HDFS中tsv文件导入到HBase.
  2. 将tsv文件转换成StoreFiles,也就是HBase的数据文件,然后借助completebulkload将数据导入HBase.

本节介绍第一种方法。方法也很简单,步骤如下:

  1. 编写JDBC接口将数据从关系型数据库中导出到本地,格式:一行对应表的一条record
  2. 将本地文件导入到HDFS
  3. 在终端中输入如下指令即可:$ bin/hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=a,b,c <tablename> <hdfs-inputdir>
    例如我的指令是:
    bin/hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:number,info:time test /user/test_data/1.tsv
    这里需要注意:HASE_ROW_KEY是对应表的行关键字,对于Dimporttsv.columns参数每一个参数都要和tsv文件中一行数据一一对应。如果可以成功运行的话,你会在终端看到系统启动一个MapReduce Job来完成数据导入工作。

3.bulk load(Importtsv | MapReduce Job)

上一节我们通过Importtsv的第一种用法实现了HBase数据导入,这种方法其实是在Map阶段使用Put指令实现数据导入的,适用于小规模数据。那么对于大规模数据,我们最好还是使用ImportTsv的第二种用法,暂用更少的CPU和网络资源。对于第二种用法,我们即可以通过命令行也可以通过编程实现。

命令行的步骤如下:

  1. 编写JDBC接口将数据从关系型数据库中导出到本地,格式:一行对应表的一条record
  2. 将本地文件导入到HDFS
  3. 在终端输入:$ bin/hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=a,b,c -Dimporttsv.bulk.output=hdfs://storefile-outputdir <tablename> <hdfs-data-inputdir> 这将会生成对应的storeFiles文件,并保存在outputdir中
  4. 在终端输入:$ bin/hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles <hdfs://storefileoutput> <tablename> 这将会把步骤3生成的storeFiles导入到HBase

例如我的指令是:
1.生成storeFiles:
bin/hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:number,info:time -Dimporttsv.bulk.output=/user/out/ test /user/test_data/1.tsv
2.导入HBase:
bin/hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /user/out test

这里简单说明一下参数:HBASE_ROW_KEY为HBase表的行关键字,name,number,time分别是三个字段,这四个字段分别对应关系型数据库的一条record;Dimporttsv.bulk.output这个参数是hdfs的地址,并且不需要提前创建out目录,但上级目录user是要自己创建的。test是我在HBase里面提前创建的一个空表,用来存放关系数据库数据的。/user/test_data/1是tsv文件存放在hdfs中的路径。

那么对于编程实现的话,步骤大致如下:

  1. 编写JDBC接口将数据从关系型数据库中导出到本地,格式:一行对应表的一条record。
  2. 将本地文件导入到HDFS。
  3. 编写MapReduce Job将数据文件转换成HFile格式文件输出。这里需要使用HFileOutputFormat。
  4. 编程借助LoadIncrementalHFiles对象将上一步生成的HFile文件导入HBase。

4.Sqoop

Sqoop是一个专门用于在hadoop和关系型数据库之间进行数据转化的工具。Sqoop对外提供一组操作命令,配置在hadoop集群之后,就可以很方便的使用了。
由于我以mysql为例,所以需要将mysql-connector-java-版本号-bin.jar文件放在Sqoop的lib目录下。同时由于Sqoop是直接在关系数据库和HBase之间工作的,所以我们不需要提前将数据从数据库中读出,而且转换的方法也很简单,只需要一条import命令即可,例如我的指令:

:~$sqoop import --connect jdbc:mysql://localhost/test --username root --password lvyang --query 'SELECT ID,Name,Number,Time FROM Info WHERE $CONDITIONS' --split-by ID --hbase-table test --column-family info

有关Sqoop Import指令参数的含义以及设置方法,可以查看其官网文档

总结

总的来说,这几种方法各有优劣,实践中到底选择哪一种需要根据问题的本身来决定。如果强调高效,稳定的话,bulk load应该是不错的选择。当然如果想要简单方便,不需要那么多繁琐的预处理,那Sqoop应该还不错。
到此,本篇博文也就讲完了,也算是对这块内容的回顾吧。里面内容还是很多的,有很多我也没法讲清楚,还需要多多学习。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值