HBase Bulk Loading 实践

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

5.3 结论

由案例可见,Bulk Loading方式导入HBase是高效的,并且耗时操作主要体现在使用Importtsv生成HBase底层可直接识别的StoreFile文件格式的步骤中。

你可能感兴趣的:(hbase)