一.概述
本文主要从HBASE入库的不同方式进行阐述,对HBASE的参数调整本文不进行过多阐述。HBASE数据入库主要目的是保证数据快速,准确,完整的进入HBASE,并在数据入库时尽量少占用大数据集群资源,减少对大数据集群的影响。
二.入库方式
HBASE数据入库主要分成以下三种方式:
1.MR预生成HFILE
采用MR的方式进行HFILE进行生成,生成HFILE文件后采用LOAD方式进行数据入库
2.MR过程中PUT
采用MR中Map阶段进行PUT数据入库
3.HBASE原生口的PUT方式
用JAVA调用HBASE的PUT接口进行数据入库
1和2都存在MR的过程,会使用集群YARN的资源,而且如果没有进行HBASE的参数调整和预分区操作,会引起HBASE的region的split;3方式采用多客户端,多线程方式进行数据入库,本身用的就是HBASE的原生方式,排序合并操作都压给了HBASE,受制于网络和内存。
从上面的原理描述,3方式看上去是入库最合适的方式,但是对于服务端的压力却是最大的。
为了完成本文所说的尽量少占用大数据集群资源目的,对于预生成HFILE方式需进行优化,不采用MR方式进行生成。
三.实现
1.非MR方式预生成HFILE方式优化
1)将数据生成KeyValue放入list,并将其进行排序
2)使用StoreFile.Writer将数据写入到HDFS的HFILE中
3)将生成的HFILE文件用doBulkLoad导入到HBASE
2.使用HBASE的原生接口PUT
四.测试
测试方案主要进行HFILE入库,PUT入库,多列,全列按不同数据量进行测试
名词解释:
file:hfile方式入库
put:put方式入库
column:多列,每列独立
columnall:全列,列合并打包
10W:代表数据量
如file_column_10w代表用hfile方式入库10W数据量的多列
注:下述时间都是秒
入库方式/提交记录数 | KV满一万 | 1万条记录 | 2万条记录 | 4万条记录 | 8万条记录 |
---|---|---|---|---|---|
file_column_10w | 158 | 122 | 114 | 110 | 106 |
file_columnall_10w | 116 | 77 | 78 | 77 | 69 |
put_column_10w | 125 | 188 | 196 | 202 | 181 |
put_columnall_10w | 78 | 53 | 62 | 60 | 68 |
file_column_100w | 1823 | 1161 | 1138 | 1005 | 1003 |
file_columnall_100w | 1230 | 597 | 565 | 539 | 510 |
put_column_100w | 1501 | 1534 | 1804 | 2100 | 1913 |
put_columnall_100w | 844 | 472 | 462 | 465 | 477 |
file_column_1000w | 10301 | ||||
file_columnall_1000w | 4806 | ||||
put_column_1000w | 21311 | ||||
put_columnall_1000w | 5050 |
五.总结
- hfile文件方式入库会随着提交数据记录数的增加而效率提升
- put方式入库提交数据记录数增加不能很明显提升效率,有时候反而会变慢,原因应该是memstore需要清除历史KeyValue的缘故,并受到缓存大小限制,而hfile方式会直接绕过memstore,不受memstore限制。
- 当数据记录数大的时候,hfile的方式优于put方式
- hfile方式在数据量小的时候,增加提交记录数效率不明显
- hfile方式可以*控制导入hfile的大小,优势就是减少hfile的compact,劣势就是需要增加按region来生成hfile防止bulkload时再分裂
- hfile方式适合大数据量数据导入,put方式小量数据导入,put会比hfile时效性高
- 全列的入库方式比多列的入库方式效率要高很多,而且HFILE文件也会小很多,相应的存储会减少,原因是减少了rowkey的存储