溫馨提示×

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

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

分區(qū)過(guò)多對(duì)HBase集群會(huì)有什么影響

發(fā)布時(shí)間:2021-12-09 10:11:49 來(lái)源:億速云 閱讀:240 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“分區(qū)過(guò)多對(duì)HBase集群會(huì)有什么影響”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

分區(qū)概念

接觸過(guò)HBase的同學(xué)都知道,HBase每張表在底層存儲(chǔ)上是由至少一個(gè)Region組成,Region實(shí)際上就是HBase表的分區(qū)。HBase新建一張表時(shí)默認(rèn)Region即分區(qū)的數(shù)量為1,一般在生產(chǎn)環(huán)境中我們都會(huì)手動(dòng)給Table提前做 "預(yù)分區(qū)",使用合適的分區(qū)策略創(chuàng)建好一定數(shù)量的分區(qū)并使分區(qū)均勻分布在不同regionserver上。一個(gè)分區(qū)在達(dá)到一定大小時(shí)會(huì)自動(dòng)Split,一分為二。

通常情況下,生產(chǎn)環(huán)境的每個(gè)regionserver節(jié)點(diǎn)上會(huì)有很多Region存在,我們一般比較關(guān)心每個(gè)節(jié)點(diǎn)上的Region數(shù)量,主要為了防止HBase分區(qū)過(guò)多影響到集群的穩(wěn)定性。 

分區(qū)過(guò)多的影響

分區(qū)過(guò)多會(huì)帶來(lái)很多不好的影響,主要體現(xiàn)在以下幾個(gè)方面。 

1. 頻繁刷寫

我們知道Region的一個(gè)列族對(duì)應(yīng)一個(gè)MemStore,假設(shè)HBase表都有統(tǒng)一的1個(gè)列族配置,則每個(gè)Region只包含一個(gè)MemStore。通常HBase的一個(gè)MemStore默認(rèn)大小為128 MB,見(jiàn)參數(shù)hbase.hregion.memstore.flush.size。當(dāng)可用內(nèi)存足夠時(shí),每個(gè)MemStore可以分配128 MB空間。當(dāng)可用內(nèi)存緊張時(shí),假設(shè)每個(gè)Region寫入壓力相同,則理論上每個(gè)MemStore會(huì)平均分配可用內(nèi)存空間。

因此,當(dāng)節(jié)點(diǎn)Region過(guò)多時(shí),每個(gè)MemStore分到的內(nèi)存空間就會(huì)很小。這個(gè)時(shí)候,寫入很小的數(shù)據(jù)量就會(huì)被強(qiáng)制Flush到磁盤,將會(huì)導(dǎo)致頻繁刷寫。頻繁刷寫磁盤,會(huì)對(duì)集群HBase與HDFS造成很大的壓力,可能會(huì)導(dǎo)致不可預(yù)期的嚴(yán)重后果。 

2. 壓縮風(fēng)暴

因Region過(guò)多導(dǎo)致的頻繁刷寫,將在磁盤上產(chǎn)生非常多的HFile小文件,當(dāng)小文件過(guò)多的時(shí)候HBase為了優(yōu)化查詢性能就會(huì)做Compaction操作,合并HFile減少文件數(shù)量。當(dāng)小文件一直很多的時(shí)候,就會(huì)出現(xiàn) "壓縮風(fēng)暴"。Compaction非常消耗系統(tǒng)io資源,還會(huì)降低數(shù)據(jù)寫入的速度,嚴(yán)重的會(huì)影響正常業(yè)務(wù)的進(jìn)行。 

3. MSLAB內(nèi)存消耗較大

MSLAB(MemStore-local allocation buffer)存在于每個(gè)MemStore中,主要是為了解決HBase內(nèi)存碎片問(wèn)題,默認(rèn)會(huì)分配 2 MB 的空間用于緩存最新數(shù)據(jù)。如果Region數(shù)量過(guò)多,MSLAB總的空間占用就會(huì)比較大。比如當(dāng)前節(jié)點(diǎn)有1000個(gè)包含1個(gè)列族的Region,MSLAB就會(huì)使用1.95GB的堆內(nèi)存,即使沒(méi)有數(shù)據(jù)寫入也會(huì)消耗這么多內(nèi)存。 

4. Master Assign Region 時(shí)間較長(zhǎng)

HBase Region過(guò)多時(shí)Master分配Region的時(shí)間將會(huì)很長(zhǎng)。特別體現(xiàn)在重啟HBase時(shí)Region上線時(shí)間較長(zhǎng),嚴(yán)重的會(huì)達(dá)到小時(shí)級(jí),造成業(yè)務(wù)長(zhǎng)時(shí)間等待的后果。

5. 影響MapReduce并發(fā)數(shù)

當(dāng)使用MapReduce操作HBase時(shí),通常Region數(shù)量就是MapReduce的任務(wù)數(shù),Region數(shù)量過(guò)多會(huì)導(dǎo)致并發(fā)數(shù)過(guò)多,產(chǎn)生過(guò)多的任務(wù)。任務(wù)太多將會(huì)占用大量資源,當(dāng)操作包含很多Region的大表時(shí),占用過(guò)多資源會(huì)影響其他任務(wù)的執(zhí)行。

計(jì)算合理分區(qū)數(shù)量

關(guān)于每個(gè)regionserver節(jié)點(diǎn)分區(qū)數(shù)量大致合理的范圍,HBase官網(wǎng)上也給出了定義:

Generally less regions makes for a smoother running cluster (you can always manually split the big regions later (if necessary) to spread the data, or request load, over the cluster); 20-200 regions per RS is a reasonable range.

可見(jiàn),通常情況下每個(gè)節(jié)點(diǎn)擁有20~200個(gè)Region是比較正常的。借鑒于20~200這個(gè)區(qū)間范圍,我們接下來(lái)具體討論。

實(shí)際上,每個(gè)RegionServer的最大Region數(shù)量由總的MemStore內(nèi)存大小決定。我們知道每個(gè)Region的每個(gè)列族對(duì)應(yīng)一個(gè)MemStore,假設(shè)HBase表都有統(tǒng)一的1個(gè)列族配置,那么每個(gè)Region只包含一個(gè)MemStore。一個(gè)MemStore大小通常在128~256 MB,見(jiàn)參數(shù)hbase.hregion.memstore.flush.size。默認(rèn)情況下,RegionServer會(huì)將自身堆內(nèi)存的40%(見(jiàn)參數(shù)hbase.regionserver.global.memstore.size)供給節(jié)點(diǎn)上所有MemStore使用,如果所有MemStore的總大小達(dá)到該配置大小,新的更新將會(huì)被阻塞并且會(huì)強(qiáng)制刷寫磁盤。因此,每個(gè)節(jié)點(diǎn)最理想的Region數(shù)量應(yīng)該由以下公式計(jì)算(假設(shè)HBase表都有統(tǒng)一的列族配置):

Region.nums = ((RS memory) * (total memstore fraction)) / ((memstore size)*(column families))

其中:

  • RS memory:表示regionserver堆內(nèi)存大小,即HBASE_HEAPSIZE。

  • total memstore fraction:表示所有MemStore占HBASE_HEAPSIZE的比例,HBase0.98版本以后由hbase.regionserver.global.memstore.size參數(shù)控制,老版本由hbase.regionserver.global.memstore.upperLimit參數(shù)控制,默認(rèn)值0.4

  • memstore size:即每個(gè)MemStore的大小,原生HBase中默認(rèn)128M。

  • column families:即表的列族數(shù)量,通常情況下只設(shè)置1個(gè),最多不超過(guò)3個(gè)。

舉個(gè)例子,假如一個(gè)集群中每個(gè)RegionServer的堆內(nèi)存是32GB,那么節(jié)點(diǎn)上最理想的Region數(shù)量應(yīng)該是32768*0.4/128 ≈ 102,所以,當(dāng)前環(huán)境中單節(jié)點(diǎn)理想情況下大概有102個(gè)Region。

這種最理想情況是假設(shè)每個(gè)Region上的填充率都一樣,包括數(shù)據(jù)寫入的頻次、寫入數(shù)據(jù)的大小,但實(shí)際上每個(gè)Region的負(fù)載各不相同,可能有的Region特別活躍負(fù)載特別高,有的Region則比較空閑。所以,通常我們認(rèn)為2~3倍的理想Region數(shù)量也是比較合理的,針對(duì)上面舉例來(lái)說(shuō),大概200~300個(gè)Region算是合理的。

如果實(shí)際的Region數(shù)量比2~3倍的計(jì)算值還要多,就要實(shí)際觀察Region的刷寫、壓縮情況了,Region越多則風(fēng)險(xiǎn)越大。經(jīng)驗(yàn)告訴我們,如果單節(jié)點(diǎn)Region數(shù)量過(guò)千,集群可能存在較大風(fēng)險(xiǎn)。

“分區(qū)過(guò)多對(duì)HBase集群會(huì)有什么影響”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

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

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

AI