1-遊走HBase的Block Cache
回過頭看看,大多都是零碎的記錄,個人認為還是非常重要的,不積窪步,無以至千里。
想想,應該拿點東西來記錄下,今天就聊聊Block Cache,因為它比較重要,作為hbase的研發人員,對它必須有所了解。
Reginserver的內存總體分成三部分,BlockCache是主要讀使用的內存,Memstore主要是讀寫使用的內存,還有其它內存。
BlockCache也稱為讀緩存,HBase會將一次文件查找的Block塊緩存到Cache中,以便後續同一請求或者鄰近數據查找請求直接從內存中獲取,避免昂貴的IO操作,重要性不言而喻。
對於讀緩存BlockCache有兩種實現機制:LRUBlockCache和BucketCache(通常是off-heap),不同工作模式下的相關配置也不盡相同,下面一起來了解了解它。
1、BlockCache的內容
HBase中最小的數據存儲單元Block,默認為64K,在建表語句中可以通過參數BlockSize指定。為了配置BlockCache,需要了解下BlockCache存儲的內容,主要包括如下幾個:
GET、scan請求獲取的數據、
緩存hbase:meta(可快速獲取HFile的元數據)、
HFiles的索引,HBase以HDFS格式將其數據存儲在HDFS中、
Bloom filters,如果使用Bloom過濾器,它們將存儲在BlockCache中。
2、BlockCache之LRUBlockCache機制
它是HBase目前默認的BlockCache機制。
LRU(Least recently used,最近最少使用)淘汰演算法大部分人都知道,其核心思想是「如果數據最近被訪問過,那麼將來被訪問的幾率也更高」;
HBase在LRU緩存基礎上,採用了緩存分層設計,將整個BlockCache分為三個優先順序隊列:single(第一次訪問)、mutil(多次訪問)和inMemory。
優缺點:
LruBlockCache,直接採用jvm提供的HashMap來管理Cache,這樣數據塊都存儲在JVM heap內,由JVM進行垃圾回收管理,簡單。
讀取緩存時可以從JVM heap中直接讀取,效率更高。
但是隨著數據從single區晉陞到mutil區,基本就伴隨著對應的內存對象從young區到old區,然後最終被淘汰,這樣就伴隨著垃圾回收,然而這種演算法會產生較多的內存碎片問題,導致垃圾回收失敗、full gc停頓。
3、BlockCache之BucketCache機制
它可解決LruBlockCache的GC缺點,不會出現大量碎片導致Full GC的情況發生。
它有多種Cache方式,有heap(使用jvm中的heap)、offheap(使用堆外內存)和file(使用文件的方式,如高速SSD盤)。
實際實現中,當啟用BucketCache時,HBase將BucketCache和LRUBlockCache搭配使用(作為二級緩存的方式),稱為CombinedBlockCache。
舉例offheap方式,在hbase-site.xml中設置以下參數:
--hbase.bucketcache.ioengine:offheap
--hfile.block.cache.size:0.2
--hbase.bucketcache.size:4196
優缺點:
極大降低了JVM GC對業務請求的實際影響,但也存在一些問題,比如使用堆外內存會存在拷貝內存的問題,一定程度上會影響讀寫性能。
本地堆棧LruBlockCache相比,從BucketCache獲取數據速度會比較慢,但是隨著時間的推移,offheap模式因為內存屬於操作系統,可以減少產生GC和碎片,長遠來說會比較穩定。
4、BlockCache不同配置場景
1)如果請求的數據比較符合緩存,命中率比較高,使用LRUBlockCache方式會比CombinedBlockCache的吞吐量高上20%(但也會犧牲一些垃圾回收)。
1)如果需要緩存的數據超過堆大小的情況下,推薦使用Block Cache下的off-heap。
2)當scan獲取數據時,可以通過setCacheBlocks方法來設置是否使用block cache,對於頻繁訪問的行才建議使用block cache。
3)對於MapReduce的Scan作為輸入任務,應該設置為setCacheBlocks(false)。
4)如果緩存遇到持續高的驅逐速率,這會導致LruBlockCache大量的垃圾回收,請使用CombinedBlockCache。
5)CombinedBlockCache在固態磁碟上使用file文件模式具有更好的垃圾回收,但吞吐量低於CombinedBlockCache使用offheap模式。
到底選擇LRUBlockCache還是BucketCache?這個和分配給RegionServer內存大小、讀寫請求比例都有關係,可通過監控來了解情況。
5、BlockCache監控
在HBase Metrics UI頁面可以監控BlockCache的使用情況,以幫助您調整BlockCache的大小。
總結:
HBase中緩存的設置對隨機讀寫性能至關重要,簡單說說LRUBlockCache和BucketCache兩種方案的實現優缺點,那在實際線上應用中到底應該選擇哪種方案呢?上面配置場景也只是一些總結,需要結合實際的場景進行分析。
推薦閱讀:
※科技與商業管理策略的結合:約翰霍普金斯大學MSIS項目
※微軟、IBM、英特爾、三星、紅帽歡迎谷歌入群,怎麼來了一條狗?
※從hive到Spark SQL
※深度學習教程 Part 1
※紙質文檔轉可編輯電子版太複雜?請看這份安裝指南