HBase Bulk Loading 实践
2015-12-31 08:50
211 查看
1. 什么是Bulk Loading ?
Bulk Loading采用MapReduce作业将数据直接生成HBase底层能够识别的StoreFile文件格式,然后直接将这些生成的StoreFile文件“热加载”(HBase不需要重启)到HBase集群中。由于采用MapReduce以及直接移动StoreFile热加载到HBase集群,这个过程比直接采用HBase Put API批量加载高效得多,并且不会过度消耗集群数据传输所占用的带宽。Bulk Loading甚至为“海量数据”加载到HBase的唯一可行、高效、稳定的方式。
2. 如何使用Bulk Loading ?
使用Bulk Loading最直接的方式是使用HBase自带的importtsv工具(一个MapReduce作业),将数据生成为HBase底层能够识别的StoreFile文件格式,再通过
completebulkload工具将生成的文件移动并热加载到HBase集群中,总结起来Bulk Loading分为以上两个步骤。
3. Importtsv的使用
3.1 基本使用方式
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=a,b,c [-Dimporttsv.separator="," -Dimporttsv.bulk.output=...] <tablename> <hdfs-inputdir>
3.2 参数说明
-Dimporttsv.columns指定数据文件对应的列与HBase表里面的哪些列(列族 : 列名)的映射关系,示例中的a,b,c的形式为columnFamily : columnQualifier
-Dimporttsv.separator指定数据文件列分隔符,默认为Tab(“\t”)
-Dimporttsv.bulk.output指定使用Bulk Loading方式生成的StoreFile文件的hdfs目标路径
<tablename>指定要导入的HBase表名
<hdfs-inputdir>指定要导入的数据文件所在的hdfs路径,可以使用正则表达式来指定某个路径下的某些文件,eg: /impottsv_data_dir/data01/* 指定导入data01下所有的数据文件
关于impottsv工具的详细使用方式请参考HBase官网文档
Importtsv有两种不同的使用方式,一种是直接将数据文件导入HBase表中(不指定-Dimporttsv.bulk.output,这种方式不是Bulk Loading,其实现也是通过Put API批量插入),一种是将数据文件生成StoreFile文件(指定-Dimporttsv.bulk.output),为Bulk Loading做准备。
3.2 注意事项
(1) 如果指定了importtsv.bulk.output,即采用Bulk Loading方式,必须确保importtsv.bulk.output在hdfs里面是不存在的,即待创建的,否则会抛FileAlreadyExistException(2) 其中参数可以指定为hdfs文件目录,这样mapreduce job就会读取该目录下所有的文件进行导入(遇到子目录会抛错,但是不影响结果),所以指定为hdfs文件目录的时候必须该目录下的所有文件内容必须是正确的,否则可能导入错误的数据
(3) 在导入海量数据之前,确保HBase目标表已经合理的进行了划分分区,否则在load到HBase的时候可能会引起大量的split操作,影响集群性能
4. CompleteBulkLoad的使用
4.1 基本使用方式
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles <hdfs://storeFileOutput> <tablename>
4.2 参数说明
<hdfs://storeFileOutput>对应前一个步骤imprttsv指定的importtsv.bulk.output参数,指定生成的storeFile文件目录
<tablename>指定要导入的HBase目标表
使用CompleteBulkLoad将StoreFile热加载到HBase集群一般都可以快速完成。所以Bulk Loading耗时主要体现在使用Importtsv生成StoreFile的步骤。
4.3 注意事项
(1) 在执行CompleteBulkLoad的时候遇到MapReduce任务卡住无法结束,通过修改<hdfs://storeFileOutput>目录以及里面的文件权限为777即可以使任务正常完成。怀疑原因是因为由于上一个步骤生成的文件权限不足以让HBase进程进行移动文件操作造成。
5. Bulk Loading使用案例
使用Bulk Loading加载1个亿的数据到HBase表(默认为3个分区),一共5个列。集群环境:CDH5.4 -> 3个节点
5.1 Importtsv
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=HBASE_ROW_KEY,info:ammeter_no1,info:update_date,info:ammeter_price,info:ammeter_no2 -Dimporttsv.separator="," -Dimporttsv.bulk.output=/cjx/hbase_bulk_load_ammeter_test AMMETER_TEST /1edata/AMMETER/*
耗时 25min
5.2 CompleteBulkLoad
Hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /cjx/hbase_bulk_load_ammeter_test AMMETER_TEST
耗时 3s