HBase数据导入方法总结(续)
转自:http://blog.csdn.net/Mr\_Lyang/article/details/51934949
引言
本文将接着上一篇博文继续介绍剩下的几种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);
}
}
1
2
3
4
5
6
7
8
9
10
11
有关map类和main函数的设计,可以自己根据问题自行设计,此处就不赘述了。
2.Importtsv(unbulk load)
ImportTsv是HBase提供的一个数据导入工具,功能是实现将tsv( tab-separated values)格式的数据导入到HBase中。它有两种用法:
- 通过Put将存放在HDFS中tsv文件导入到HBase.
- 将tsv文件转换成StoreFiles,也就是HBase的数据文件,然后借助completebulkload将数据导入HBase.
本节介绍第一种方法。方法也很简单,步骤如下:
- 编写JDBC接口将数据从关系型数据库中导出到本地,格式:一行对应表的一条record
- 将本地文件导入到HDFS
- 在终端中输入如下指令即可:
$ 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和网络资源。对于第二种用法,我们即可以通过命令行也可以通过编程实现。
命令行的步骤如下:
- 编写JDBC接口将数据从关系型数据库中导出到本地,格式:一行对应表的一条record
- 将本地文件导入到HDFS
- 在终端输入:
$ 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中 - 在终端输入:
$ 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中的路径。
那么对于编程实现的话,步骤大致如下:
- 编写JDBC接口将数据从关系型数据库中导出到本地,格式:一行对应表的一条record。
- 将本地文件导入到HDFS。
- 编写MapReduce Job将数据文件转换成HFile格式文件输出。这里需要使用HFileOutputFormat。
- 编程借助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
1
2
有关Sqoop Import指令参数的含义以及设置方法,可以查看其官网文档。
总结
总的来说,这几种方法各有优劣,实践中到底选择哪一种需要根据问题的本身来决定。如果强调高效,稳定的话,bulk load应该是不错的选择。当然如果想要简单方便,不需要那么多繁琐的预处理,那Sqoop应该还不错。
到此,本篇博文也就讲完了,也算是对这块内容的回顾吧。里面内容还是很多的,有很多我也没法讲清楚,还需要多多学习。
还没有评论,来说两句吧...