和其他數據庫一樣,優化IO也是HBase提升性能的不二法寶,而提供緩存更是優化的重中之重。
根據二八法則,80%的業務請求都集中在20%的熱點數據上,因此將這部分數據緩存起就可以極大地提升系統性能。
一、HBase中緩存結構
HBase在實現中提供了兩種緩存結構:MemStore和BlockCache。其中MemStore稱為寫緩存,HBase執行寫操作首先會將數據寫入MemStore,並順序寫入HLog,等滿足一定條件後統一將MemStore中數據刷新到磁盤,這種設計可以極大地提升HBase的寫性能。不僅如此,MemStore對於讀性能也至關重要,假如沒有MemStore,讀取剛寫入的數據就需要從文件中通過IO查找,這種代價顯然是昂貴的!BlockCache稱為讀緩存,HBase會將一次文件查找的Block塊緩存到Cache中,以便後續同一請求或者鄰近數據查找請求,可以直接從內存中獲取,避免昂貴的IO操作。
使用 Scan API 掃描的時候,建議關閉 BlockCache,Scan 的場景中緩存意義不大。
HBase 讀取數據的時候優先查找 MemStore(最新的更新版本),其次會查找 BlockCache。首先了解一下 HBase Block 的概念。
二、HBase Block
在 HBase 中,存儲文件被劃分成若干個小存儲塊,默認是64k。在 get 或 scan 中一次會完全加載一個 block 到內存中。不同於 HDFS Block,HDFS 層面的塊是用於拆分大文件以提供分佈式存儲,HBase Block 塊存在於 HFile 的內部的數據結構。
在建表語句中可以通過參數BlockSize指定:BLOCKSIZE => '65536'
三、HBase BlockCache
BlockCache是Region Server級別的,一個Region Server只有一個Block Cache,在Region Server啟動的時候完成Block Cache的初始化工作。
HBase 提供了幾種 BlockCache 方案:
- LruBlockCache
- SlabCache,HBASE-4027 0.92版本提供,在1.0版本後被廢棄 HBASE-11307
- BucketCache,HBASE-7404 0.95版本提供
- ExternalBlockCache,HBASE-13170 1.10版本提供
四、HBase 讀路徑
HBase 讀路徑為,首先檢查 MemStore,然後檢查 BlockCache,最後檢索 HFile,並且合併一條數據的信息(read merge)返回給客戶端。