1.需求
最近在项目中需要将大量存在于文本文件中的数据批量导入到hbase表中,并且涉及到将多个文本文件中的数据合并到同一张hbase表中,而这些文本文件中的字段并不是完全相同的
2.工具选型
因为项目当中查询数据采用的是Phoenix,因此,最初想利用Phoenix的Bulk CSV Data Loading来实现,但是简单调研之后,发现并不适合我们本次的需求,后面我会补充一篇文章来对hbase的bulkload和Phoenix的Bulk CSV Data Loading进行一个简单的对比
3.HBase Bulk Load概览
HBase Bulk Load分为两个步骤,第一个步骤采用MapReduce将文件中的数据转换成hbase内部的数据格式,第二个步骤直接将生成的StoreFiles导入到HBase当中,使用Bulk Load导数据比直接使用HBase API能够明显地降低CPU和网络资源的使用率
4.HBase Bulk Load使用说明
4.1.ImportTsv
ImportTsv是一个能够将Tsv格式的数据处理成可以直接导入到HBase中的数据格式(StoreFiles)的工具,基本使用方式如下:
HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase classpath` ${HADOOP_HOME}/bin/hadoop jar ${HBASE_HOME}/hbase-server-VERSION.jar importtsv -Dimporttsv.columns=HBASE_ROW_KEY,d:c1,d:c2 -Dimporttsv.bulk.output=hdfs://storefileoutput datatsv hdfs://inputfile
这一步执行完毕后会在hdfs的/storefile-outputdir中生成中间文件StoreFiles,接着调用completebulkload就可以将数据最终导入到hbase中
注:
- 上面的Dimporttsv.columns=HBASE_ROW_KEY为固定写法,指定我们的数据的第一列为row key;
- d:c1中d为需要导入hbase表的列族,c1为列族中的列;
- -Dimporttsv.bulk.output=hdfs://storefileoutput为生成的中间文件StoreFiles的存放路径
- datatsv为hbase的表名;
- hdfs://inputfile为tsv文件的路径;
补充几个可选参数:
-Dimporttsv.skip.bad.lines=false -遇到错误行则任务自动失败
-Dimporttsv.separator=, -自定义行内分隔符为comma
-Dimporttsv.timestamp=currentTimeAsLong -导入数据时使用自定义的时间戳(基本不用)
-Dimporttsv.mapper.class=my.Mapper -使用自定义的Mapper类来替代默认的 org.apache.hadoop.hbase.mapreduce.TsvImporterMapper
4.2CompleteBulkLoad
completebulkload 会将上一步生成的StoreFiles导入到HBase中,导入成功后自动删除这些中间文件
HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase classpath` ${HADOOP_HOME}/bin/hadoop jar ${HBASE_HOME}/hbase-server-VERSION.jar completebulkload <hdfs://storefileoutput> <tablename>
5.温馨提示
如果需要BulkLoad的数据量过大,在hbase建表的时候请提前做好合适的pre-split
6.一个简单的小例子
6.1hbase建表语句
create 'user', '0', SPLITS => ['1', '2', '3', '4', '5','6', '7', '8', '9']
6.2ImportTsv
注:6.2和6.3中的命令和jar包路径均为hdp2.5的默认安装位置
HADOOP_CLASSPATH=`/usr/hdp/current/hbase-master/bin/hbase classpath` /usr/hdp/current/hadoop-client/bin/hadoop jar /usr/hdp/2.5.0.0-1245/hbase/lib/hbase-server-1.1.2.2.5.0.0-1245.jar importtsv -Dimporttsv.separator=, -Dimporttsv.columns=HBASE_ROW_KEY,0:id_name,0:id_no,0:id_type,0:user_status,0:if_receive,0:mobile_no -Dimporttsv.bulk.output=hdfs:///bulkdata/a user hdfs:///data/WB10_user1019_im.txt
6.3Complete Bulk Load
HADOOP_CLASSPATH=`/usr/hdp/current/hbase-master/bin/hbase classpath` /usr/hdp/current/hadoop-client/bin/hadoop jar /usr/hdp/2.5.0.0-1245/hbase/lib/hbase-server-1.1.2.2.5.0.0-1245.jar completebulkload hdfs:///bulkdata/a user
至此,HBase Bulk Load的基本使用方法已经介绍完了,如需了解更多内容,请参考HBase官方文档