大數據

HBASE入庫方式比較

一.概述

本文主要從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,並將其進行排序
Snipaste_2020-02-29_14-57-35.png
2)使用StoreFile.Writer將數據寫入到HDFS的HFILE中
Snipaste_2020-02-29_15-11-18.png
3)將生成的HFILE文件用doBulkLoad導入到HBASE
Snipaste_2020-02-29_15-14-43.png

2.使用HBASE的原生接口PUT
Snipaste_2020-02-29_15-19-51.png

四.測試

測試方案主要進行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

五.總結

  1. hfile文件方式入庫會隨著提交數據記錄數的增加而效率提升
  2. put方式入庫提交數據記錄數增加不能很明顯提升效率,有時候反而會變慢,原因應該是memstore需要清除歷史KeyValue的緣故,並受到緩存大小限制,而hfile方式會直接繞過memstore,不受memstore限制。
  3. 當數據記錄數大的時候,hfile的方式優於put方式
  4. hfile方式在數據量小的時候,增加提交記錄數效率不明顯
  5. hfile方式可以自由控制導入hfile的大小,優勢就是減少hfile的compact,劣勢就是需要增加按region來生成hfile防止bulkload時再分裂
  6. hfile方式適合大數據量數據導入,put方式小量數據導入,put會比hfile時效性高
  7. 全列的入庫方式比多列的入庫方式效率要高很多,而且HFILE文件也會小很多,相應的存儲會減少,原因是減少了rowkey的存儲

Leave a Reply

Your email address will not be published. Required fields are marked *