一.概述
本文主要從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的存儲