HBase导入数据之必会的BulkLoad


前言

通常MapReduce在写HBase时使用的是TableOutputFormat方式,在Reduce中生产PUT对象写入HBase,该方式在大数据量写入时效率十分低下(HBase会block写入,频繁进行flush,split,compact等大量IO操作),并对HBase节点的稳定性造成影响。

一、Bulk Load简介

HBase支持Bulk Load的入库方式,它是利用hbase的数据信息按照特定格式存储在hdfs内这一原理,直接在HDFS中生成持久化的HFile数据格式文件,然后上传至合适位置,即完成巨量数据的快速入库方法。

配合MapReduce完成,高效便捷,而且不占用Region资源,增添负载,在大数据量写入时能极大的提高写入效率,并降低对HBase节点的写入压力。

通过使用先生成HFile,然后再Bulk Load到HBase的方式来替代之前直接调用HTableOutputFormat的方法有如下好处:
(1)消除了对HBase集群的插入压力
(2)提高了Job的运行速度,降低了Job的执行时间

二、数据准备

TSV的全称是 Tab Separated Values File,也就是制表符分隔的文本文件。由于我们在上篇讲解importTSV时创建过了一个,这回在本地直接创建一个简单的文件student2.tsv

10001	zhangsan	35	male	beijing	0109876543
10002	lisi	32	male	shanghia	0109876563
10003	zhaoliu	35	female	hangzhou	01098346543
10004	qianqi	35	male	shenzhen	01098732543

分别对应我们的ROWKEY、姓名、年龄、性别、地点、电话

在本地创建好后我们需要上传到HDFS上,首先提前创建一个目录

$HADOOP_HOME/bin/hdfs dfs -mkdir /user/root/hbase/importtsv

上传刚才的文件到指定目录

$HADOOP_HOME/bin/hdfs dfs -put student2.tsv /user/root/hbase/importtsv

数据的准备工作完成。

2、在HBase上创建表

进入目录bin/start-hbase.sh启动HBase,bin/hbase shell进入命令行,键入命令:

create 'student2','info'

其中student2是表名,info是列簇。

3、数据导入生产HFile

在此之前,请大家再次确认配置好了hbase与hadoop的集成,如果没有,添加环境变量。

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HBASE_HOME/lib/*

因为我们执行的import跑的是MapReduce程序,需要hadoop能够找到hbase相应jar包,所以将HBASE下的lib添加进HADOOP_CLASSPATH

完成后启动程序:

${HADOOP_HOME}/bin/yarn jar \
${HBASE_HOME}/lib/hbase-server-0.98.6-cdh5.3.6.jar importtsv \
-Dimporttsv.columns=HBASE_ROW_KEY,\
info:name,info:age,info:sex,info:address,info:phone \
-Dimporttsv.bulk.output=hdfs://hadoop:9000/user/root/hbase/hfileoutput \
student2 \
hdfs://hadoop:9000/user/root/hbase/importtsv

其中,第二行的jar包大家改成对应自己版本的名称
最后几行的hdfs地址也请大家自行修改成自己的

运行后我们可以在shell看到MR运行成功
在这里插入图片描述
在这里插入图片描述

这时我们进入hdfs的web页面可以看到这个目录下已经多了输出的HFile文件
在这里插入图片描述

四、bulkload到hbase表中

执行completebulkload:

${HADOOP_HOME}/bin/yarn jar \
${HBASE_HOME}/lib/hbase-server-0.98.6-cdh5.3.6.jar \
completebulkload \
hdfs://hadoop:9000/user/root/hbase/hfileoutput \
student2

执行完毕进入hbase shell里查看:
在这里插入图片描述
数据完整地导入了进去。

总结

bulkload是HBase非常常用的一种高效率导入大量数据的方式。
相比直接使用importTSV而言,importTSV写入后是仍存在内存中的,没有及时Flush到文件,而bulkload是直接跳过所有包括Region的IO,MemStore的Flush等中转步骤,节省了很多时间。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值