冷熱分離功能支持將冷熱數據存儲在不同的介質上,可以大大降低存儲成本,HBase支持對同一張表的數據進行冷熱分離存儲。 ...
本文分享自華為雲社區 《華為雲HBase 冷熱分離最佳實踐》,作者:pippo。
HBase介紹
HBase是Hadoop Database的簡稱,是建立在Hadoop文件系統之上的分散式面向列的資料庫,它具有高可靠、高性能、面向列和可伸縮的特性,提供快速隨機訪問海量數據能力。
HBase採用Master/Slave架構,由HMaster節點、RegionServer節點、ZooKeeper集群組成,底層數據存儲在HDFS上。
整體架構如圖所示:
HMaster主要負責:
- 在HA模式下,包含主用Master和備用Master。
- 主用Master:負責HBase中RegionServer的管理,包括表的增刪改查;RegionServer的負載均衡,Region分佈調整;Region分裂以及分裂後的Region分配;RegionServer失效後的Region遷移等。
- 備用Master:當主用Master故障時,備用Master將取代主用Master對外提供服務。故障恢復後,原主用Master降為備用。
RegionServer主要負責:
- 存放和管理本地HRegion。
- RegionServer負責提供表數據讀寫等服務,是HBase的數據處理和計算單元,直接與Client交互。
- RegionServer一般與HDFS集群的DataNode部署在一起,實現數據的存儲功能。讀寫HDFS,管理Table中的數據。
ZooKeeper集群主要負責:
- 存放整個 HBase集群的元數據以及集群的狀態信息。
- 實現HMaster主從節點的Failover。
HDFS集群主要負責:
- HDFS為HBase提供高可靠的文件存儲服務,HBase的數據全部存儲在HDFS中。
結構說明:
Store
- 一個Region由一個或多個Store組成,每個Store對應圖中的一個Column Family。
MemStore
- 一個Store包含一個MemStore,MemStore緩存客戶端向Region插入的數據,當RegionServer中的MemStore大小達到配置的容量上限時,RegionServer會將MemStore中的數據“flush”到HDFS中。
StoreFile
- MemStore的數據flush到HDFS後成為StoreFile,隨著數據的插入,一個Store會產生多個StoreFile,當StoreFile的個數達到配置的閾值時,RegionServer會將多個StoreFile合併為一個大的StoreFile。
HFile
- HFile定義了StoreFile在文件系統中的存儲格式,它是當前HBase系統中StoreFile的具體實現。
HLog(WAL)
- HLog日誌保證了當RegionServer故障的情況下用戶寫入的數據不丟失,RegionServer的多個Region共用一個相同的HLog。
HBase提供兩種API來寫入數據。
- Put:數據直接發送給RegionServer。
- BulkLoad:直接將HFile載入到表存儲路徑。
HBase 冷熱分離訴求
HBase是Hadoop Database的簡稱,是建立在Hadoop文件系統之上的分散式面向列的資料庫,它具有高可靠、高性能、面向列和可伸縮的特性,提供快速隨機訪問海量數據能力。
在海量大數據場景下,表中的部分業務數據隨著時間的推移僅作為歸檔數據或者訪問頻率很低,同時這部分歷史數據體量非常大,比如訂單數據或者監控數據,如果降低這部分數據的存儲成本將會極大的節省企業的成本。
冷熱分離功能支持將冷熱數據存儲在不同的介質上,冷數據的存儲類型為普通IO存儲,熱數據的存儲類型為超高IO存儲。普通IO存儲的價格僅為超高IO存儲的30%,大大降低了存儲成本。
HBase 冷熱分離介紹
HBase支持對同一張表的數據進行冷熱分離存儲。用戶在表上配置數據冷熱時間分界點後,HBase會依賴用戶寫入數據的時間戳(毫秒)和時間分界點來判斷數據的冷熱。數據開始存儲在熱存儲上,隨著時間的推移慢慢往冷存儲上遷移。同時用戶可以任意變更數據的冷熱分界點,數據可以從熱存儲到冷存儲,也可以從冷存儲到熱存儲。
整體架構如圖所示:
命令介紹
設置表的冷熱分界線
創建冷熱分離表:
hbase(main):002:0> create 'hot_cold_table', {NAME=>'f', COLD_BOUNDARY=>'86400'}
參數說明:
NAME:需要冷熱分離的列族。
COLD_BOUNDARY:冷熱分離時間點,單位為秒(s)。例如COLD_BOUNDARY為86400,代表86400秒(一天)前寫入的數據會被自動歸檔到冷存儲。
取消冷熱分離。hbase(main):004:0> alter 'hot_cold_table', {NAME=>'f', COLD_BOUNDARY=>""}
為已經存在的表設置冷熱分離,或者修改冷熱分離分界線,單位為秒。
hbase(main):005:0> alter 'hot_cold_table', {NAME=>'f', COLD_BOUNDARY=>'86400'}
查詢冷熱分離是否設置或者修改成功hbase(main):005:0> desc 'hot_cold_table'
數據寫入冷熱分離的表與普通表的數據寫入方式完全一致,數據會先存儲在熱存儲(超高IO)中。隨著時間的推移,如果一行數據滿足當前時間-時間列值>COLD_BOUNDARY設置的值條件,則會在執行Compaction時被歸檔到冷存儲(普通IO)中。
插入記錄執行“put”命令往指定表插入一條記錄,需要指定表的名稱,主鍵,自定義列,以及插入的具體值。
hbase(main):004:0> put 'hot_cold_table','row1','cf:a','value1'
參數說明:
hot_cold_table:表的名稱。
row1:主鍵。
cf:a:自定義的列。
value1:插入的值。
數據查詢由於冷熱數據都在同一張表中,因此用戶所有的查詢操作都只需在一張表內進行。在查詢時,建議通過配置TimeRange來指定查詢的時間範圍,系統將會根據指定的時間範圍決定查詢模式,即僅查詢熱存儲、僅查詢冷存儲或同時查詢冷存儲和熱存儲。如果查詢時未限定時間範圍,則會導致查詢冷數據。在這種情況下,查詢吞吐量會受到冷存儲的限制。
隨機查詢
不指定HOT_ONLY參數來查詢數據。在這種情況下,將會查詢冷存儲中的數據。
hbase(main):001:0> get 'hot_cold_table', 'row1'
通過指定HOT_ONLY參數來查詢數據。在這種情況下,只會查詢熱存儲中的數據。
hbase(main):002:0> get 'hot_cold_table', 'row1', {HOT_ONLY=>true}
通過指定TimeRange參數來查詢數據。在這種情況下,CloudTable將會比較TimeRange和冷熱邊界值,以確定是只查詢熱存儲還是冷存儲中的數據,還是同時查詢熱冷存儲中的數據
hbase(main):003:0> get 'hot_cold_table', 'row1', {TIMERANGE => [0, 1568203111265]}
範圍查詢
不指定HOT_ONLY參數來查詢數據。在這種情況下,將會查詢冷存儲中的數據。
hbase(main):001:0> scan 'hot_cold_table', {STARTROW =>'row1', STOPROW=>'row9'}
通過指定HOT_ONLY參數來查詢數據。在這種情況下,只會查詢熱存儲中的數據。hbase(main):002:0> scan 'hot_cold_table', {STARTROW =>'row1', STOPROW=>'row9', HOT_ONLY=>true}
通過指定TimeRange參數來查詢數據。在這種情況下,CloudTable將會比較TimeRange和冷熱邊界值,以確定是只查詢熱存儲還是冷存儲中的數據,還是同時查詢熱冷存儲中的數據。
hbase(main):003:0> scan 'hot_cold_table', {STARTROW =>'row1', STOPROW=>'row9', TIMERANGE => [0, 1568203111265]}
數據合併
- 合併表所有分區的熱數據區。
hbase(main):002:0> major_compact 'hot_cold_table', nil, 'NORMAL', 'HOT'
- 合併表所有分區的冷數據區。
hbase(main):002:0> major_compact 'hot_cold_table', nil, 'NORMAL', 'COLD'
- 合併表所有分區的熱冷數據區。
hbase(main):002:0> major_compact 'hot_cold_table', nil, 'NORMAL', 'ALL'
HBase 冷熱分離效果