W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
HBase提供了兩種不同的BlockCache實(shí)現(xiàn),來(lái)緩存從HDFS中讀取的數(shù)據(jù):默認(rèn)的on-heap LruBlockCache和BucketCache(通常是off-heap)。本節(jié)討論每個(gè)實(shí)現(xiàn)的優(yōu)點(diǎn)和缺點(diǎn)、如何選擇適當(dāng)?shù)倪x項(xiàng)以及每種配置選項(xiàng)。
LruBlockCache是原始實(shí)現(xiàn),完全在Java堆內(nèi)。 BucketCache是可選的,主要用于保持塊緩存數(shù)據(jù)脫離堆,盡管BucketCache也可以是文件支持的緩存。
當(dāng)您啟用BucketCache時(shí),您將啟用兩層緩存系統(tǒng)。我們?cè)?jīng)將層描述為“L1”和“L2”,但是已經(jīng)不贊成使用hbase-2.0.0的這個(gè)術(shù)語(yǔ)?!癓1”緩存引用了LruBlockCache的一個(gè)實(shí)例,并且將“L2”引用到了堆外的BucketCache。相反,當(dāng)啟用BucketCache時(shí),所有DATA塊都保存在BucketCache層中,元塊(INDEX和BLOOM塊)在LruBlockCache堆中。這兩個(gè)層次的管理以及控制它們之間的塊移動(dòng)的策略是由 CombinedBlockCache 完成的。
除了緩存實(shí)現(xiàn)本身之外,您可以設(shè)置一些常規(guī)配置選項(xiàng)來(lái)控制緩存的執(zhí)行方式。請(qǐng)參閱CacheConfig。設(shè)置了其中任何選項(xiàng)后,重新啟動(dòng)或滾動(dòng)重新啟動(dòng)群集以使配置生效。檢查日志以查找錯(cuò)誤或意外行為。
LruBlockCache是??一個(gè)LRU緩存,它包含三個(gè)塊級(jí)別的優(yōu)先級(jí)以允許掃描電阻和內(nèi)存中的ColumnFamilies:
HColumnDescriptor.setInMemory(true);
如果從java創(chuàng)建表,或者在shell中創(chuàng)建或更改表時(shí)設(shè)置IN_MEMORY ? true,例如:
hbase(main):003:0> create 't', {NAME => 'f', IN_MEMORY => 'true'}
所有用戶表默認(rèn)啟用塊緩存,這意味著任何讀取操作都會(huì)加載LRU緩存。這對(duì)于大量的用例可能是有益的,但通常需要進(jìn)一步的調(diào)整才能獲得更好的性能。一個(gè)重要的概念是工作集大小或WSS,即:“計(jì)算問(wèn)題答案所需的內(nèi)存量”。對(duì)于一個(gè)網(wǎng)站,這將是在短時(shí)間內(nèi)回答查詢所需的數(shù)據(jù)。
計(jì)算緩存中HBase有多少內(nèi)存的方法是:
number of region servers * heap size * hfile.block.cache.size * 0.99
塊緩存的默認(rèn)值為0.4,表示可用堆的40%。最后一個(gè)值(99%)是在驅(qū)逐開(kāi)始之后LRU緩存中的默認(rèn)可接受加載因子。它被包含在這個(gè)等式中的原因是,說(shuō)可以使用100%的可用內(nèi)存是不現(xiàn)實(shí)的,因?yàn)檫@會(huì)使得該過(guò)程從加載新塊的位置阻塞。下面是一些示例:
您的數(shù)據(jù)不是塊緩存的唯一常駐者。以下是您可能必須考慮的其他問(wèn)題:
該hbase:meta
表被強(qiáng)制進(jìn)入塊緩存并具有內(nèi)存優(yōu)先級(jí),這意味著它們更難以驅(qū)逐。(根據(jù)區(qū)域的數(shù)量,hbase:meta表格可以占用幾個(gè)MB。)
一個(gè)HFILE是HBase的使用將數(shù)據(jù)存儲(chǔ)在HDFS文件格式。它包含一個(gè)多層索引,它允許HBase在不必讀取整個(gè)文件的情況下查找數(shù)據(jù)。這些索引的大小是塊大?。J(rèn)為64KB),密鑰大小和存儲(chǔ)的數(shù)據(jù)量的一個(gè)因素。對(duì)于大數(shù)據(jù)集,每個(gè)區(qū)域服務(wù)器的數(shù)字大約為1GB并不罕見(jiàn),但并不是所有的數(shù)據(jù)都會(huì)被緩存,因?yàn)長(zhǎng)RU會(huì)逐出未使用的索引。
存儲(chǔ)的值僅為圖片的一半,因?yàn)槊總€(gè)值都與其鍵一起存儲(chǔ)(行鍵,族限定符和時(shí)間戳)。
就像HFile索引一樣,這些數(shù)據(jù)結(jié)構(gòu)(啟用時(shí))都存儲(chǔ)在LRU中。
目前,衡量HFile索引和bloom過(guò)濾器大小的推薦方法是查看區(qū)域服務(wù)器Web UI并檢查相關(guān)度量標(biāo)準(zhǔn)。對(duì)于密鑰,可以使用HFile命令行工具完成采樣并查找平均密鑰大小度量。從HBase 0.98.3開(kāi)始,您可以在用戶界面的特殊Block Cache部分查看有關(guān)BlockCache統(tǒng)計(jì)信息和指標(biāo)的詳細(xì)信息。
當(dāng)WSS不適合內(nèi)存時(shí),使用塊緩存通常是不好的。例如,在所有區(qū)域服務(wù)器的塊高速緩存中都有40GB可用的情況,但您需要處理1TB的數(shù)據(jù)。其中一個(gè)原因是由驅(qū)逐產(chǎn)生的流失會(huì)不必要地觸發(fā)更多的垃圾收集。這里有兩個(gè)用例:
一個(gè)有趣的設(shè)置是我們只緩存META塊,并在每個(gè)訪問(wèn)中讀取DATA塊。如果DATA塊適用于fscache,則當(dāng)訪問(wèn)在非常大的數(shù)據(jù)集中完全隨機(jī)時(shí),此替代方法可能有意義。要啟用此設(shè)置,請(qǐng)更改您的表格和每個(gè)列族集:BLOCKCACHE ? 'false'。您只對(duì)此列族 "禁用" BlockCache。您永遠(yuǎn)不能禁用META塊的緩存。由于HBASE-4683總是緩存索引和bloom塊,所以即使BlockCache被禁用,我們也會(huì)緩存META塊。
BucketCache的通常部署是通過(guò)一個(gè)管理類來(lái)設(shè)置兩個(gè)緩存層:由LruBlockCache實(shí)現(xiàn)的堆緩存和使用BucketCache實(shí)現(xiàn)的第二個(gè)緩存。管理類默認(rèn)為CombinedBlockCache。上一個(gè)鏈接描述了CombinedBlockCache實(shí)現(xiàn)的緩存“策略”。簡(jiǎn)而言之,它的工作方式是將元塊(INDEX和BLOOM)保留在堆上的LruBlockCache層中,并將DATA塊保存在BucketCache層中。
與原生堆內(nèi)LruBlockCache相比,從hbase-2.0.0之前的BucketCache中獲取數(shù)據(jù)時(shí),抓取總是比較慢。但是,隨著時(shí)間的推移,延遲趨于不那么不穩(wěn)定,因?yàn)槭褂肂ucketCache時(shí)垃圾收集較少,因?yàn)樗诠芾鞡lockCache分配,而不是GC。如果BucketCache部署在堆外模式下,則該內(nèi)存根本不由GC管理。這就是為什么你會(huì)在2.0.0之前使用BucketCache,所以你的延遲不那么不穩(wěn)定,為了減少GC和堆碎片,所以你可以安全地使用更多的內(nèi)存。
在2.0.0之前版本中,可以配置BucketCache,以便接收LruBlockCache驅(qū)逐的victim
。所有數(shù)據(jù)和索引塊首先緩存在L1中。當(dāng)驅(qū)逐發(fā)生在 L1,塊(或victims
)將移至L2。設(shè)置cacheDataInL1
通過(guò)(HColumnDescriptor.setCacheDataInL1(true)
或shell,設(shè)置CACHE_DATA_IN_L1
為true:來(lái)創(chuàng)建或修改列族,如:
hbase(main):003:0> create 't', {NAME => 't', CONFIGURATION => {CACHE_DATA_IN_L1 => 'true'}}
HBASE-11425更改了HBase讀取路徑,以便它可以將讀取數(shù)據(jù)從堆中保留,避免將緩存數(shù)據(jù)復(fù)制到j(luò)ava堆上。在hbase-2.0.0中,堆外延遲接近堆緩存延遲時(shí)間,并且不會(huì)引發(fā)GC。
從HBase 2.0.0開(kāi)始,L1和L2的概念已被棄用。當(dāng)BucketCache打開(kāi)時(shí),DATA塊將總是進(jìn)入BucketCache,而INDEX/BLOOM塊將進(jìn)入堆LRUBlockCache。cacheDataInL1
支持已被刪除。
BucketCache塊緩存可以部署為堆外(off-heap)、文件(file)或mmaped文件模式。
您可以通過(guò)hbase.bucketcache.ioengine設(shè)置來(lái)進(jìn)行設(shè)置。將它設(shè)置為offheap使BucketCache將其分配置于堆外,并且file:PATH_TO_FILE的ioengine設(shè)置將指示BucketCache使用文件緩存(特別是在您將某些快速I/O附加到SSD等盒子時(shí)有用)。從2.0.0開(kāi)始,可以有多個(gè)文件支持BucketCache。當(dāng)緩存大小要求很高時(shí),這非常有用。對(duì)于多個(gè)備份文件,將ioengine配置為files:PATH_TO_FILE1,PATH_TO_FILE2,PATH_TO_FILE3。BucketCache也可以配置為使用mmapped文件。將 ioengine 配置為 mmap: PATH_TO_FILE。
可以在我們繞過(guò)CombinedBlockCache策略的情況下部署分層設(shè)置,并將BucketCache作為嚴(yán)格的L2緩存工作到L1 LruBlockCache。對(duì)于這樣的設(shè)置,設(shè)置hbase.bucketcache.combinedcache.enabled為false。在這種模式下,從L1中逐出時(shí),塊將轉(zhuǎn)到L2。當(dāng)一個(gè)塊被緩存時(shí),它會(huì)先在L1中緩存。當(dāng)我們?nèi)ふ揖彺鎵K時(shí),我們先看看L1,如果找不到,那么搜索L2。我們稱這種部署格式為Raw L1 + L2。注意:這個(gè)L1 + L2模式從2.0.0中刪除。當(dāng)使用BucketCache時(shí),它將嚴(yán)格地是DATA緩存,并且LruBlockCache將緩存INDEX/META塊。
其他BucketCache配置包括:指定要在重新啟動(dòng)時(shí)保持緩存的位置、使用多少線程來(lái)編寫(xiě)緩存等。
要檢查它是否啟用,請(qǐng)查找描述緩存設(shè)置的日志行,它將詳細(xì)介紹BucketCache的部署方式。另請(qǐng)參閱UI。它將詳細(xì)介紹緩存分層及其配置。
此示例為具有1 GB堆緩存的4 GB脫離堆BucketCache提供配置。
在RegionServer上執(zhí)行配置。
設(shè)置hbase.bucketcache.ioengine和hbase.bucketcache.size> 0啟用CombinedBlockCache。讓我們假設(shè)RegionServer已經(jīng)設(shè)置為以5G堆運(yùn)行:即HBASE_HEAPSIZE=5g。
HBASE_OFFHEAPSIZE=5G
<property>
<name>hbase.bucketcache.ioengine</name>
<value>offheap</value>
</property>
<property>
<name>hfile.block.cache.size</name>
<value>0.2</value>
</property>
<property>
<name>hbase.bucketcache.size</name>
<value>4196</value>
</property>
在上面,我們將BucketCache設(shè)置為4G。我們將堆上的LruBlockCache配置為RegionServer堆大小的20%(0.2)(0.2 * 5G = 1G)。換句話說(shuō),像通常一樣配置L1 LruBlockCache(就好像沒(méi)有L2高速緩存一樣)。
HBase-10641引入了為HBase 0.98和更高版本的BucketCache的bucket配置多種大小的功能。要配置多個(gè)存儲(chǔ)區(qū)大小,請(qǐng)將新屬性hfile.block.cache.sizes(而不是hfile.block.cache.size)配置為以逗號(hào)分隔的塊大小列表(從最小到最大排列),并且不含空格。目標(biāo)是根據(jù)您的數(shù)據(jù)訪問(wèn)模式優(yōu)化存儲(chǔ)bucket大小。以下示例配置大小為4096和8192的存儲(chǔ)bucket。
<property>
<name>hfile.block.cache.sizes</name>
<value>4096,8192</value>
</property>
HBase中的直接內(nèi)存使用情況
默認(rèn)的最大直接內(nèi)存因JVM而異。傳統(tǒng)上它是64M或某一關(guān)系到被分配的堆大小(-Xmx)或根本沒(méi)有限制(JDK7)。HBase服務(wù)器使用直接內(nèi)存,特別是短路讀取,承載的DFSClient將分配直接內(nèi)存緩沖區(qū)。DFSClient使用的數(shù)量不容易量化;它是打開(kāi)的HFiles*hbase.dfs.client.read.shortcircuit.buffer.size的數(shù)目,其中hbase.dfs.client.read.shortcircuit.buffer.size設(shè)置為128k。如果你使用堆外緩存,你將會(huì)使用直接內(nèi)存。RPCServer使用ByteBuffer池。從2.0.0開(kāi)始,這些緩沖區(qū)是堆外ByteBuffers。啟動(dòng)您的JVM,在conf/hbase-env.sh中確保-XX:MaxDirectMemorySize設(shè)置,考慮堆外塊緩存(hbase.bucketcache.size)、DFSClient使用,RPC端ByteBufferPool最大大小。這必須比堆外BlockCache大小和最大ByteBufferPool大小的總和要高一點(diǎn)。為最大直接內(nèi)存大小分配額外的1-2
GB在測(cè)試中起作用。直接內(nèi)存是Java進(jìn)程堆的一部分,與-Xmx分配的對(duì)象堆是分開(kāi)的。MaxDirectMemorySize
分配的值不得超過(guò)物理RAM,并且由于其他內(nèi)存要求和系統(tǒng)限制,可能會(huì)少于總可用RAM。
您可以通過(guò)查看UI 中的“服務(wù)器度量標(biāo)準(zhǔn):內(nèi)存(Server Metrics: Memory)”選項(xiàng)卡,查看RegionServer配置為使用多少內(nèi)存和堆外/直接內(nèi)存以及以及每次使用的時(shí)間。它也可以通過(guò)JMX獲取。特別是可以在java.nio.type=BufferPool,name=direct
bean 上找到服務(wù)器當(dāng)前使用的直接內(nèi)存。Terracotta在Java中使用非堆內(nèi)存有一個(gè)很好的記錄。這是為了他們的產(chǎn)品BigMemory,但是很多問(wèn)題都提到了對(duì)任何試圖外堆的嘗試,檢查出來(lái)。
hbase.bucketcache.percentage.in.combinedcache
這是一個(gè)HBase 1.0之前的配置,因?yàn)樗芑靵y。這是一個(gè)浮點(diǎn)數(shù),你會(huì)設(shè)置0.0到1.0之間的某個(gè)值,它的默認(rèn)值是0.9。如果部署使用CombinedBlockCache,則LruBlockCache L1大小計(jì)算為:(1 - hbase.bucketcache.percentage.in.combinedcache) * size-of-bucketcache
,BucketCache大小為:hbase.bucketcache.percentage.in.combinedcache * size-of-bucket-cache
。如果size-of-bucket-cache指定為Megabytes,則它EITHER配置hbase.bucketcache.size的值;如果hbase.bucketcache.size在0到1.0之間,則hbase.bucketcache.size
* -XX:MaxDirectMemorySize
。
在1.0中,它應(yīng)該更直接。Onheap LruBlockCache大小設(shè)置為使用hfile.block.cache.size設(shè)置(并非最佳)的java堆的一小部分,并且BucketCache在絕對(duì)兆字節(jié)中設(shè)置為上述值。
HBASE- 11331引入了懶惰的BlockCache解壓縮,更簡(jiǎn)單地稱為壓縮BlockCache。當(dāng)啟用壓縮BlockCache時(shí),數(shù)據(jù)和編碼數(shù)據(jù)塊將以磁盤(pán)格式緩存在BlockCache中,而不是在緩存之前解壓縮和解密。
對(duì)于承載更多數(shù)據(jù)而不適合緩存的RegionServer,通過(guò)SNAPPY壓縮啟用此功能可以使吞吐量增加50%,平均延遲增加30%,同時(shí)將垃圾收集增加80%,并增加整體CPU負(fù)載2%。有關(guān)如何衡量和實(shí)現(xiàn)性能的更多詳細(xì)信息,請(qǐng)參閱HBASE-11331。對(duì)于容納適合緩存的數(shù)據(jù)的RegionServer,或者如果您的工作負(fù)載對(duì)額外的CPU或垃圾收集負(fù)載敏感,則可能會(huì)收到較少的收益。
壓縮的BlockCache默認(rèn)是禁用的。要啟用它,請(qǐng)?jiān)谒蠷egionServers的hbase-site.xml中設(shè)置hbase.block.data.cachecompressed為true。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: