溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么理解HBase1.x 讀緩存BlockCache

發(fā)布時(shí)間:2021-11-23 18:03:39 來源:億速云 閱讀:158 作者:柒染 欄目:大數(shù)據(jù)

本篇文章給大家分享的是有關(guān)怎么理解HBase1.x 讀緩存BlockCache,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

 

1.概述

緩存對(duì)于任何一個(gè)數(shù)據(jù)庫都非常重要,如果有條件允許,我們更愿意把所有的數(shù)據(jù)都緩存到內(nèi)存中,就不存在任何的磁盤IO,但對(duì)于大數(shù)據(jù)來說緩存所有數(shù)據(jù)幾乎是不可能的,基于二八法則,我們80%的業(yè)務(wù)請(qǐng)求都集中在20%的數(shù)據(jù)里面,如果把這20%的數(shù)據(jù)緩存到內(nèi)存中,數(shù)據(jù)庫的性能將會(huì)有極大的提升。

HBase上Regionserver的內(nèi)存分為兩個(gè)部分:一部分作為Memstore,主要用來寫;另外一部分作為BlockCache,主要用于讀。

1)寫請(qǐng)求會(huì)先寫入Memstore,Regionserver會(huì)給每個(gè)HStore提供一個(gè)Memstore,當(dāng)Memstore滿128MB以后,此時(shí)當(dāng)前的HRegion中所有的MemStore會(huì)Flush到HDFS中。

當(dāng)一個(gè)regionserver中的所有MemStore的大小總和超過了hbase.regionserver.global.memstore.upperLimit的大小,默認(rèn)40%的內(nèi)存使用量。此時(shí)當(dāng)前HRegionServer中所有HRegion中的MemStore都會(huì)Flush到HDFS中,F(xiàn)lush順序是MemStore大小的倒序,直到總體的MemStore使用量低于hbase.regionserver.global.memstore.lowerLimit,默認(rèn)38%的內(nèi)存使用量。

2)讀請(qǐng)求先到Memstore中查數(shù)據(jù),查不到就到BlockCache中查,再查不到就會(huì)到磁盤上讀,并把讀的結(jié)果放入BlockCache。由于BlockCache采用的是LRU策略,因此BlockCache達(dá)到上限heapsize * hfile.block.cache.size * 0.85后,會(huì)啟動(dòng)淘汰機(jī)制,淘汰掉最老的一批數(shù)據(jù)。

一個(gè)Regionserver上有一個(gè)BlockCache和N個(gè)Memstore,它們的大小之和不能大于等于heapsize * 0.8,否則HBase不能正常啟動(dòng)。

 

2.BlockCache機(jī)制

為了高效獲取數(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級(jí)別的,一個(gè)Region Server只有一個(gè)Block Cache,在Region Server啟動(dòng)的時(shí)候完成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中所處的位置如下圖中所示:

怎么理解HBase1.x 讀緩存BlockCache

 

三種策略

 

1. LRUBlockCache

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ū),分別占到整個(gè)BlockCache大小的25%、50%、25%。

  • single-access 優(yōu)先級(jí):當(dāng)一個(gè)數(shù)據(jù)塊第一次從HDFS讀取時(shí),它會(huì)具有這種優(yōu)先級(jí),并且在緩存空間需要被回收(置換)時(shí),它屬于優(yōu)先被考慮范圍內(nèi)。它的優(yōu)點(diǎn)在于:一般被掃描(scanned)讀取的數(shù)據(jù)塊,相較于之后會(huì)被用到的數(shù)據(jù)塊,更應(yīng)該被優(yōu)先清除

  • mutil-access優(yōu)先級(jí):如果一個(gè)數(shù)據(jù)塊,屬于Single Access優(yōu)先級(jí),但是之后被再次訪問,則它會(huì)升級(jí)為Multi Access優(yōu)先級(jí)。在緩存里的內(nèi)容需要被清除(置換)時(shí),這部分內(nèi)容屬于次要被考慮的范圍

  • in-memory-access優(yōu)先級(jí):表示數(shù)據(jù)可以常駐內(nèi)存,一般用來存放訪問頻繁、數(shù)據(jù)量小的數(shù)據(jù),比如元數(shù)據(jù),用戶也可以在建表的時(shí)候通過設(shè)置列族屬性IN-MEMORY= true將此列族放入in-memory區(qū),兩種具體實(shí)現(xiàn)方式如下:

a.在Java中可以調(diào)用: HColumnDescriptor.setInMemory(true);

b.在hbase shell 中創(chuàng)建或修改一個(gè)表時(shí),可以使用 IN_MEMORY => true,例如:create ‘t’, {NANME => ‘f’, IN_MEMORY => ‘true’}

弊端:使用LRUBlockCache緩存機(jī)制會(huì)因?yàn)镃MS GC策略導(dǎo)致內(nèi)存碎片過多,從而可能引發(fā)臭名昭著的Full GC,觸發(fā)可怕的’stop-the-world’暫停;尤其在大內(nèi)存條件下,一次Full GC很可能會(huì)持續(xù)較長時(shí)間,甚至達(dá)到分鐘級(jí)別。大家知道Full GC是會(huì)將整個(gè)進(jìn)程暫停的(稱為stop-the-wold暫停),因此長時(shí)間Full GC必然會(huì)極大影響業(yè)務(wù)的正常讀寫請(qǐng)求。

 

2. SlabCache

在1.0版本后被廢棄了(HBASE-11307);內(nèi)部結(jié)構(gòu)是劃分為兩塊,80%和20%;緩存的數(shù)據(jù)如小于等于blocksize,則放在在前面的區(qū)域(80%區(qū)域);如果block大于1x但是小于2x將會(huì)放置到后面區(qū)域(20%區(qū)域);如果大于2x則不進(jìn)行緩存。

和LRUBlockCache相同,SlabCache也使用Least-Recently-Used算法對(duì)過期Block進(jìn)行淘汰。

和LRUBlockCache不同的是,SlabCache淘汰Block的時(shí)候只需要將對(duì)應(yīng)的bufferbyte標(biāo)記為空閑,后續(xù)cache對(duì)其上的內(nèi)存直接進(jìn)行覆蓋即可。

線上集群環(huán)境中,不同表不同列族設(shè)置的BlockSize都可能不同,很顯然,默認(rèn)只能存儲(chǔ)兩種固定大小Block的SlabCache方案不能滿足部分用戶場景,比如用戶設(shè)置BlockSize = 256K,簡單使用SlabCache方案就不能達(dá)到這部分Block緩存的目的。因此HBase實(shí)際實(shí)現(xiàn)中將SlabCache和LRUBlockCache搭配使用,稱為DoubleBlockCache。一次隨機(jī)讀中,一個(gè)Block塊從HDFS中加載出來之后會(huì)在兩個(gè)Cache中分別存儲(chǔ)一份;緩存讀時(shí)首先在LRUBlockCache中查找,如果Cache Miss再在SlabCache中查找,此時(shí)如果命中再將該Block放入LRUBlockCache中。

弊端:經(jīng)過實(shí)際測試,DoubleBlockCache方案有很多弊端。比如SlabCache設(shè)計(jì)中固定大小內(nèi)存設(shè)置會(huì)導(dǎo)致實(shí)際內(nèi)存使用率比較低,而且使用LRUBlockCache緩存Block依然會(huì)因?yàn)镴VM GC產(chǎn)生大量內(nèi)存碎片。因此在HBase 0.98版本之后,該方案已經(jīng)被不建議使用。

 

3. BucketCache

這種策略是阿里設(shè)計(jì)出來的  CDH集群用的這種策略,BucketCache通過配置可以工作在三種模式下:heap,offheap和file。無論工作在那種模式下,BucketCache都會(huì)申請(qǐng)?jiān)S多帶有固定大小標(biāo)簽的Bucket,和SlabCache一樣,一種Bucket存儲(chǔ)一種指定BlockSize的數(shù)據(jù)塊,但和SlabCache不同的是,BucketCache會(huì)在初始化的時(shí)候申請(qǐng)14個(gè)不同大小的Bucket,而且即使在某一種Bucket空間不足的情況下,系統(tǒng)也會(huì)從其他Bucket空間借用內(nèi)存使用,不會(huì)出現(xiàn)內(nèi)存使用率低的情況。接下來再來看看不同工作模式,heap模式表示這些Bucket是從JVM Heap中申請(qǐng),offheap模式使用DirectByteBuffer技術(shù)實(shí)現(xiàn)堆外內(nèi)存存儲(chǔ)管理,而file模式使用類似SSD的高速緩存文件存儲(chǔ)數(shù)據(jù)塊。

弊端:實(shí)際實(shí)現(xiàn)中,HBase將BucketCache和LRUBlockCache搭配使用,稱為CombinedBlockCache。和DoubleBlockCache不同,系統(tǒng)在LRUBlockCache中主要存儲(chǔ)Index Block和Bloom Block,而將Data Block存儲(chǔ)在BucketCache中。因此一次隨機(jī)讀需要首先在LRUBlockCache中查到對(duì)應(yīng)的Index Block,然后再到BucketCache查找對(duì)應(yīng)數(shù)據(jù)塊。BucketCache通過更加合理的設(shè)計(jì)修正了SlabCache的弊端,極大降低了JVM GC對(duì)業(yè)務(wù)請(qǐng)求的實(shí)際影響,但也存在一些問題,比如使用堆外內(nèi)存會(huì)存在拷貝內(nèi)存的問題,一定程度上會(huì)影響讀寫性能。

以上就是怎么理解HBase1.x 讀緩存BlockCache,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI