本篇文章給大家分享的是有關(guān)怎么理解HBase1.x 讀緩存BlockCache,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、長白網(wǎng)絡(luò)推廣、微信平臺小程序開發(fā)、長白網(wǎng)絡(luò)營銷、長白企業(yè)策劃、長白品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供長白建站搭建服務(wù),24小時服務(wù)熱線:18982081108,官方網(wǎng)址:m.rwnh.cn
緩存對于任何一個數(shù)據(jù)庫都非常重要,如果有條件允許,我們更愿意把所有的數(shù)據(jù)都緩存到內(nèi)存中,就不存在任何的磁盤IO,但對于大數(shù)據(jù)來說緩存所有數(shù)據(jù)幾乎是不可能的,基于二八法則,我們80%的業(yè)務(wù)請求都集中在20%的數(shù)據(jù)里面,如果把這20%的數(shù)據(jù)緩存到內(nèi)存中,數(shù)據(jù)庫的性能將會有極大的提升。
HBase上Regionserver的內(nèi)存分為兩個部分:一部分作為Memstore,主要用來寫;另外一部分作為BlockCache,主要用于讀。
1)寫請求會先寫入Memstore,Regionserver會給每個HStore提供一個Memstore,當(dāng)Memstore滿128MB以后,此時當(dāng)前的HRegion中所有的MemStore會Flush到HDFS中。
當(dāng)一個regionserver中的所有MemStore的大小總和超過了hbase.regionserver.global.memstore.upperLimit
的大小,默認(rèn)40%的內(nèi)存使用量。此時當(dāng)前HRegionServer中所有HRegion中的MemStore都會Flush到HDFS中,F(xiàn)lush順序是MemStore大小的倒序,直到總體的MemStore使用量低于hbase.regionserver.global.memstore.lowerLimit
,默認(rèn)38%的內(nèi)存使用量。
2)讀請求先到Memstore中查數(shù)據(jù),查不到就到BlockCache中查,再查不到就會到磁盤上讀,并把讀的結(jié)果放入BlockCache。由于BlockCache采用的是LRU策略,因此BlockCache達(dá)到上限heapsize * hfile.block.cache.size * 0.85
后,會啟動淘汰機(jī)制,淘汰掉最老的一批數(shù)據(jù)。
一個Regionserver上有一個BlockCache和N個Memstore,它們的大小之和不能大于等于heapsize * 0.8
,否則HBase不能正常啟動。
為了高效獲取數(shù)據(jù),HBase設(shè)置了BlockCache機(jī)制,內(nèi)存中緩存block,Block大體來分為兩類,一類是JVM的heap內(nèi)存,一類是heap off內(nèi)存;第一類的cache策略叫做LRUCache,第二類Cache策略有SlabCache以及BucketCache兩類;
BlockCache是Region Server級別的,一個Region Server只有一個Block Cache,在Region Server啟動的時候完成Block Cache的初始化工作。到目前為止,HBase先后實(shí)現(xiàn)了3種Block Cache方案,LRUBlockCache是最初的實(shí)現(xiàn)方案,也是默認(rèn)的實(shí)現(xiàn)方案;HBase 0.92版本實(shí)現(xiàn)了第二種方案SlabCache,見HBASE-4027
;HBase 0.96之后官方提供了另一種可選方案BucketCache,見HBASE-7404
。
BlockCache在HBase中所處的位置如下圖中所示:
Least-Recently-Used,HBase默認(rèn)的BlockCache實(shí)現(xiàn)方案,LRU緩存把最近最少使用的數(shù)據(jù)移除,讓給最新讀取的數(shù)據(jù)。而往往最常讀取的,也是讀取次數(shù)最多的,所以,利用LRU緩存,我們能夠提高系統(tǒng)的性能。
LRUBlockCache將緩存分為三塊:single-access區(qū)、mutil-access區(qū)、in-memory區(qū),分別占到整個BlockCache大小的25%、50%、25%。
single-access 優(yōu)先級:當(dāng)一個數(shù)據(jù)塊第一次從HDFS讀取時,它會具有這種優(yōu)先級,并且在緩存空間需要被回收(置換)時,它屬于優(yōu)先被考慮范圍內(nèi)。它的優(yōu)點(diǎn)在于:一般被掃描(scanned)讀取的數(shù)據(jù)塊,相較于之后會被用到的數(shù)據(jù)塊,更應(yīng)該被優(yōu)先清除
mutil-access優(yōu)先級:如果一個數(shù)據(jù)塊,屬于Single Access優(yōu)先級,但是之后被再次訪問,則它會升級為Multi Access優(yōu)先級。在緩存里的內(nèi)容需要被清除(置換)時,這部分內(nèi)容屬于次要被考慮的范圍
in-memory-access優(yōu)先級:表示數(shù)據(jù)可以常駐內(nèi)存,一般用來存放訪問頻繁、數(shù)據(jù)量小的數(shù)據(jù),比如元數(shù)據(jù),用戶也可以在建表的時候通過設(shè)置列族屬性IN-MEMORY= true將此列族放入in-memory區(qū),兩種具體實(shí)現(xiàn)方式如下:
a.在Java中可以調(diào)用: HColumnDescriptor.setInMemory(true);
b.在hbase shell 中創(chuàng)建或修改一個表時,可以使用 IN_MEMORY => true,例如:create ‘t’, {NANME => ‘f’, IN_MEMORY => ‘true’}
弊端:使用LRUBlockCache緩存機(jī)制會因?yàn)镃MS GC策略導(dǎo)致內(nèi)存碎片過多,從而可能引發(fā)臭名昭著的Full GC,觸發(fā)可怕的’stop-the-world’暫停;尤其在大內(nèi)存條件下,一次Full GC很可能會持續(xù)較長時間,甚至達(dá)到分鐘級別。大家知道Full GC是會將整個進(jìn)程暫停的(稱為stop-the-wold暫停),因此長時間Full GC必然會極大影響業(yè)務(wù)的正常讀寫請求。
在1.0版本后被廢棄了(HBASE-11307);內(nèi)部結(jié)構(gòu)是劃分為兩塊,80%和20%;緩存的數(shù)據(jù)如小于等于blocksize,則放在在前面的區(qū)域(80%區(qū)域);如果block大于1x但是小于2x將會放置到后面區(qū)域(20%區(qū)域);如果大于2x則不進(jìn)行緩存。
和LRUBlockCache相同,SlabCache也使用Least-Recently-Used算法對過期Block進(jìn)行淘汰。
和LRUBlockCache不同的是,SlabCache淘汰Block的時候只需要將對應(yīng)的bufferbyte標(biāo)記為空閑,后續(xù)cache對其上的內(nèi)存直接進(jìn)行覆蓋即可。
線上集群環(huán)境中,不同表不同列族設(shè)置的BlockSize都可能不同,很顯然,默認(rèn)只能存儲兩種固定大小Block的SlabCache方案不能滿足部分用戶場景,比如用戶設(shè)置BlockSize = 256K,簡單使用SlabCache方案就不能達(dá)到這部分Block緩存的目的。因此HBase實(shí)際實(shí)現(xiàn)中將SlabCache和LRUBlockCache搭配使用,稱為DoubleBlockCache。一次隨機(jī)讀中,一個Block塊從HDFS中加載出來之后會在兩個Cache中分別存儲一份;緩存讀時首先在LRUBlockCache中查找,如果Cache Miss再在SlabCache中查找,此時如果命中再將該Block放入LRUBlockCache中。
弊端:經(jīng)過實(shí)際測試,DoubleBlockCache方案有很多弊端。比如SlabCache設(shè)計(jì)中固定大小內(nèi)存設(shè)置會導(dǎo)致實(shí)際內(nèi)存使用率比較低,而且使用LRUBlockCache緩存Block依然會因?yàn)镴VM GC產(chǎn)生大量內(nèi)存碎片。因此在HBase 0.98版本之后,該方案已經(jīng)被不建議使用。
這種策略是阿里設(shè)計(jì)出來的 CDH集群用的這種策略,BucketCache通過配置可以工作在三種模式下:heap,offheap和file。無論工作在那種模式下,BucketCache都會申請?jiān)S多帶有固定大小標(biāo)簽的Bucket,和SlabCache一樣,一種Bucket存儲一種指定BlockSize的數(shù)據(jù)塊,但和SlabCache不同的是,BucketCache會在初始化的時候申請14個不同大小的Bucket,而且即使在某一種Bucket空間不足的情況下,系統(tǒng)也會從其他Bucket空間借用內(nèi)存使用,不會出現(xiàn)內(nèi)存使用率低的情況。接下來再來看看不同工作模式,heap模式表示這些Bucket是從JVM Heap中申請,offheap模式使用DirectByteBuffer技術(shù)實(shí)現(xiàn)堆外內(nèi)存存儲管理,而file模式使用類似SSD的高速緩存文件存儲數(shù)據(jù)塊。
弊端:實(shí)際實(shí)現(xiàn)中,HBase將BucketCache和LRUBlockCache搭配使用,稱為CombinedBlockCache。和DoubleBlockCache不同,系統(tǒng)在LRUBlockCache中主要存儲Index Block和Bloom Block,而將Data Block存儲在BucketCache中。因此一次隨機(jī)讀需要首先在LRUBlockCache中查到對應(yīng)的Index Block,然后再到BucketCache查找對應(yīng)數(shù)據(jù)塊。BucketCache通過更加合理的設(shè)計(jì)修正了SlabCache的弊端,極大降低了JVM GC對業(yè)務(wù)請求的實(shí)際影響,但也存在一些問題,比如使用堆外內(nèi)存會存在拷貝內(nèi)存的問題,一定程度上會影響讀寫性能。
以上就是怎么理解HBase1.x 讀緩存BlockCache,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
當(dāng)前題目:怎么理解HBase1.x讀緩存BlockCache
文章網(wǎng)址:http://m.rwnh.cn/article30/jdijso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、營銷型網(wǎng)站建設(shè)、全網(wǎng)營銷推廣、面包屑導(dǎo)航、企業(yè)建站、品牌網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)