一.概述
本文主要從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 | 69 | |
put_column_10w | 125 | 188 | 196 | 202 | 181 |
put_columnall_10w | 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的存儲