HBase数据导入-ImportTsv
ImportTsv进行数据导入有两种方式:
ImportTsv介绍
将数据导入HBase,通常HBase用户会使用HBase API进行数据导入,但是如果一次性导入大批量数据,可能会占用大量Regionserver资源,影响存储在该Regionserver上其他表的操作,或者性能低下
ImportTsv是HBase官方提供了基于mapreduce进行批量数据导入的工具,ImportTsv可以将HDFS上的TSV格式(默认制表符分隔\t,或者自定义分隔符的其他格式数据文件也可,逗号‘,’分隔的也可以,需要在参数中指定分隔符)的数据文件通过命令简单方便地导入到HBase中,对于大数据量的导入非常实用。
1、直接导入
此种方式是使用TableOutputFormat在map中put数据到HBase中
使用方法:
$ bin/hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=a,b,c <tablename> <hdfs-inputdir>
- -Dimporttsv.columns即导入的列,
例如:
-Dimporttsv.columns=cf:col1,cf:col2…
- hdfs-inputdir即数据文件在HDFS的路径,例如:
/hbase_tsv_input
- 如果使用的不是制表符\t分隔,请指定参数:
-Dimporttsv.separator=','
命令举例:
$ bin/hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=cf:col1,cf:col2 test /hbase_tsv_input
至此,第一种方式导入数据成功,在控制台会看到执行一些map任务,执行完成之后数据导入完成。 总结:这种方式,使用简单,一条命令搞定,但是在导入大批量数据的时候有可能会存在问题,尤其是column比较多的宽表导入的时候,会出现RegionTooBusyException,导致数据丢失,因此建议在数据量不是特别大并且column不是特别多的情况下使用。
2、Bulk-Load方式
通过mapreduce先生成HFile格式的文件,再执行CompleteBulkLoad命令将文件move到HBase相应目录。
Bulkload过程主要包括三部分:
1、从数据源(通常是文本文件或其他的数据库)提取数据并上传到HDFS。抽取数据到HDFS和Hbase并没有关系,所以大家可以选用自己擅长的方式进行,本文就不介绍了。
2、利用MapReduce作业处理事先准备的数据 。这一步需要一个MapReduce作业,并且大多数情况下还需要我们自己编写Map函数,而Reduce函数不需要我们考虑,由HBase提供。该作业需要使用rowkey(行键)作为输出Key;KeyValue、Put或者Delete作为输出Value。MapReduce作业需要使用HFileOutputFormat2来生成HBase数据文件。为了有效的导入数据,需要配置HFileOutputFormat2使得每一个输出文件都在一个合适的区域中。为了达到这个目的,MapReduce作业会使用Hadoop的TotalOrderPartitioner类根据表的key值将输出分割开来。HFileOutputFormat2的方法configureIncrementalLoad()会自动的完成上面的工作。
3、告诉RegionServers数据的位置并导入数据。这一步是最简单的,通常需要使用LoadIncrementalHFiles(更为人所熟知是completebulkload工具),将文件在HDFS上的位置传递给它,它就会利用RegionServer将数据导入到相应的区域。
第一步:
$ bin/hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=a,b,c -Dimporttsv.bulk.output=hdfs://storefile-outputdir <tablename> <hdfs-data-inputdir>
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv \
-Dimporttsv.bulk.output=/user/pingz/hbase/20181105 \
-Dimporttsv.columns=HBASE_ROW_KEY,dat:imei,dat:androidid,dat:mac,dat:imsi,dat:ip,dat:country\
hbase_table\
/user/pingz/source/20181105/
第一步中,在1的基础上添加了-Dimporttsv.bulk.output参数来指定output目录,即HFile的输出目录,此目录在执行前不能存在,如果存在请删除。
第二步:
bin/hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles <hdfs://storefileoutput> <tablename>
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /user/pingz/hbase/20181105 hbase_table
第二步就是讲HFile move到HBase相应的目录。第一个参数就是第一步中的output目录,tableName和1中相同,就是表名。
总结
bulk-load导入方式完成,等待执行结束即可,第一步可能会花费很长时间,第二步较快。这种方式对Regionserver更加友好一些,加载数据几乎不占用Regionserver的计算资源,因为只是在HDFS上生成HFile,移动HFile文件,然后通知HMaster将该Regionserver的一个或多个region上线,大数据量导入推荐使用此方式