文章目录
- 前言
- 一、Bulk Load简介
- 二、数据准备
- 2、在HBase上创建表
- 3、数据导入生产HFile
- 四、bulkload到hbase表中
- 总结
前言
通常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等中转步骤,节省了很多时间。