一、簡介
從HBase-1.1.0起,HBase可以使用memcached作為外部BlockCache,這是一個在裝置失效或者更新時不會發生完全的冷緩存的很好的特性。用句通俗的話講,就是HBase出現故障或者更新時,緩存輕易不會丢失。
二、啟動
通過配置以下兩個參數實作Allow block cache to be external的啟動:
配置hbase.blockcache.use.external為true,并且通過配置hbase.cache.memcached.servers來指明memcached servers.
三、實作分析
1、構造
實作HBase external BlockCache的主要是MemcachedBlockCache這個類,它同LruBlockCache一樣,實作了BlockCache接口。在其構造函數中,主要是執行個體化了一個Memcached用戶端MemcachedClient,通過這個用戶端完成緩存的相關操作,如下:
2、緩存
緩存還是通過cacheBlock()方法來實作,如下:
需要緩存的對象Cacheable必須是繼承HFileBlock的子類才行,然後通過上述client将其add入Memcached。
3、回收緩存
緩存的回收,則是通過client的delete操作完成的,如下:
4、擷取緩存
擷取緩存則是通過getBlock()方法實作的,它是通過client的get()操作來實作,如下:
5、初始化BlockCache
BlockCache的初始化是在類CacheConfig的靜态方法instantiateBlockCache()中完成的,代碼如下:
注釋比較清晰,讀者可自行閱讀。
getL2()方法,在啟用外部緩存的情況下,通過getExternalBlockcache()方法擷取外部緩存對象,否則會嘗試擷取BucketCache,如下:
外部緩存對象通過hbase.blockcache.external.class反射構造而成,而BucketCache的是否能夠構造,需要綜合判斷一些條件,這個後續再分析。
需要額外注意的是,上述代碼中有一個地方,即l1.setVictimCache(l2),這麼做的目的是讓l1和l2能夠進行同步,在l1中擷取不到緩存時,查詢l2,并将可能的結果同步到l1中,這個下篇文章會有介紹。
下一篇博文會對上述緩存中的CombinedBlockCache和InclusiveCombinedBlockCache做一些簡單介紹。