hbase官方提供了基于mapreduce的批量数据导入工具:bulk load和importtsv。关于bulk load大家可以看下我另一篇http://www.linuxi
一、概述
hbase官方提供了基于mapreduce的批量数据导入工具:bulk load和importtsv。关于bulk load大家可以看下我另一篇。
通常hbase用户会使用hbase api导数,但是如果一次性导入大批量数据,可能占用大量regionserver资源,影响存储在该regionserver上其他表的查询,本文将会从源码上解析importtsv数据导入工具,探究如何高效导入数据到hbase。
二、importtsv介绍
importtsv是hbase提供的一个命令行工具,可以将存储在hdfs上的自定义分隔符(默认\t)的数据文件,通过一条命令方便的导入到hbase表中,对于大数据量导入非常实用,其中包含两种方式将数据导入到hbase表中:
第一种是使用tableoutputformat在reduce中插入数据;
第二种是先生成hfile格式的文件,再执行一个叫做completebulkload的命令,将文件move到hbase表空间目录下,同时提供给client查询。
三、源码解析
本文基于cdh5 hbase0.98.1,importtsv的入口类是org.apache.hadoop.hbase.mapreduce.importtsv
string hfileoutpath = conf.get(bulk_output_conf_key);
string columns[] = conf.getstrings(columns_conf_key);
if (hfileoutpath != null) {
if (!admin.tableexists(tablename)) {
log.warn(format(table '%s' does not exist., tablename));
// todo: this is backwards. instead of depending on the existence of a table,
// create a sane splits file for hfileoutputformat based on data sampling.
createtable(admin, tablename, columns);
}
htable table = new htable(conf, tablename);
job.setreducerclass(putsortreducer.class);
path outputdir = new path(hfileoutpath);
fileoutputformat.setoutputpath(job, outputdir);
job.setmapoutputkeyclass(immutablebyteswritable.class);
if (mapperclass.equals(tsvimportertextmapper.class)) {
job.setmapoutputvalueclass(text.class);
job.setreducerclass(textsortreducer.class);
} else {
job.setmapoutputvalueclass(put.class);
job.setcombinerclass(putcombiner.class);
}
hfileoutputformat.configureincrementalload(job, table);
} else {
if (mapperclass.equals(tsvimportertextmapper.class)) {
usage(tsvimportertextmapper.class.tostring()
+ should not be used for non bulkloading case. use
+ tsvimportermapper.class.tostring()
+ or custom mapper whose value type is put.);
system.exit(-1);
}
// no reducers. just write straight to table. call inittablereducerjob
// to set up the tableoutputformat.
tablemapreduceutil.inittablereducerjob(tablename, null, job);
job.setnumreducetasks(0);
}
从importtsv.createsubmittablejob方法中判断参数bulk_output_conf_key开始,这步直接影响importtsv的mapreduce作业最终以哪种方式入hbase库
如果不为空并且用户没有自定义mapper实现类(参数importtsv.mapper.class)时,则使用putsortreducer,其中会对put排序,如果每行记录有很多column,则会占用reducer大量的内存资源进行排序。
configuration conf = job.getconfiguration();
hbaseconfiguration.merge(conf, hbaseconfiguration.create(conf));
job.setoutputformatclass(tableoutputformat.class);
如果为空,调用tablemapreduceutil.inittablereducerjob初始化tableoutputformat的reducer输出,此方式不需要使用reducer,因为直接在mapper的outputformat中会批量的调用put api将数据提交到regionserver上(相当于并行的执行hbase put api)
四、实战
1、使用tableoutputformat的put api上传数据,非bulk-loading
$ bin/hbase org.apache.hadoop.hbase.mapreduce.importtsv -dimporttsv.columns=a,b,c
2、使用bulk-loading生成storefiles(hfile)
step1、生成hfile
$ bin/hbase org.apache.hadoop.hbase.mapreduce.importtsv -dimporttsv.columns=a,b,c -dimporttsv.bulk.output=hdfs://storefile-outputdir
step2、完成导入
$ bin/hbase org.apache.hadoop.hbase.mapreduce.loadincrementalhfiles
五、总结
在使用importtsv时,,一定要注意参数importtsv.bulk.output的配置,通常来说使用bulk output的方式对regionserver来说更加友好一些,这种方式加载数据几乎不占用regionserver的计算资源,因为只是在hdfs上移动了hfile文件,然后通知hmaster将该regionserver的一个或多个region上线。
hadoop+hbase搭建云存储总结 pdf
hbase 结点之间时间不一致造成regionserver启动失败
hadoop+zookeeper+hbase集群配置
hadoop集群安装&hbase实验环境搭建
基于hadoop集群的hbase集群的配置 ‘
hadoop安装部署笔记之-hbase完全分布模式安装
单机版搭建hbase环境图文教程详解
hbase 的详细介绍:请点这里
hbase 的下载地址:请点这里