Smart's Blog

HBase 批量导入数据

序言:
       我们在使用HBase做数据存储的过程中,经常要从不同的数据源往HBase批量导入大量的数据。一般的做法是先从数据源导出一份数据文件,并上传到hdfs中,然后利用HBase的ImportTsv工具读取数据文件并转化为HBase使用的StoreFile,最后再把生成StoreFile加载到HBase集群中去。

image

       数据导出过程不多做介绍了,不同的数据源有不同的导出方式,需要注意的是导出的数据文件一定要上传的HDFS中去。然后先介绍一下ImportTsv这个工具。ImportTsv是HBase发行的一个命令行工具,这个工具可以使用制表符拆分数据(TSV)格式的文件执行批量导入。该工具默认使用HBase的put()API一行一行地向HBase插入数据。但是,也可以使用importtsv.bulk.ouput选项,这样importtsv工具会使用HFileOutPutFormat来生成StoreFile文件,然后将这些文件批量载入到HBase中去。
       再看一下这个工具具体怎么使用。第一种使用方式是默认使用HBase的put()API,命令如下:
1
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=a,b,c <tablename> <inputdir>

该命令需要三个参数,-Dimporttsv.columns是列名(第一列默认为RowKey),tablename是需要导入数据的目标表,inputdir是hdfs中的数据文件。这种方式比较简单,但是导入效率不高,不适合大数据批量导入。
       再看一看第二种方式,即在该命令中添加importtsv.bulk.output参数:

1
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=a,b,c -Dimporttsv.bulk.output=<hdfspath> <tablename> <inputdir>

这样importtsv工具会使用HFileOutPutFormart在我们指定的hdfs目录下来生成StoreFile。
最后使用CompleteBulkLoad工具将生成的文件加载到HBase集群,有两种使用方式:
可以直接使用明确的类:

1
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles <hdfs://storefileoutput> <tablename>

也可以调用jar包,并加上completebulkload这个参数:

1
hadoop jar ${HBASE_HOME}/hbase-server-VERSION.jar completebulkload -conf ~/hbase-site.xml <hdfs://storefileoutput> <tablename>

       这种方式会起一个MapReduce任务完成StoreFile文件的生成,然后再将StoreFile文件mv到HBase集群的数据目录中,执行得非常快。但是需要注意的是,如果region的边界在批量导入或准备数据和完成之间的过程中有改动,completebulkload工具会自动地根据新的边界将这些数据文件进行拆分。这一步不是最高效的,我们需要尽量减少数据准备和数据载入之间的延迟。所以我们执行批量数据导入任务需要和其他数据导入的任务避开,保障我们的任务在执行时没有其他客户端在对同一张表进行操作。