溫馨提示×

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

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

HBase如何調(diào)優(yōu)

發(fā)布時(shí)間:2021-12-08 14:53:47 來源:億速云 閱讀:154 作者:小新 欄目:云計(jì)算

小編給大家分享一下HBase如何調(diào)優(yōu),相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

1. 表的設(shè)計(jì)

1.1 提前創(chuàng)建多個(gè)Region
默認(rèn)情況下,在創(chuàng)建HBase表的時(shí)候會(huì)自動(dòng)創(chuàng)建一個(gè)Region分區(qū),當(dāng)導(dǎo)入數(shù)據(jù)的時(shí)候,所有的HBase客戶端都向這一個(gè)Region寫數(shù)據(jù),直到這個(gè)Region足夠大了才進(jìn)行切分。一種可以加快批量寫入速度的方法是通過預(yù)先創(chuàng)建一些空的Regions,這樣當(dāng)數(shù)據(jù)寫入HBase時(shí),會(huì)按照Region分區(qū)情況,在集群內(nèi)做數(shù)據(jù)的負(fù)載均衡。


1.2 Row Key設(shè)計(jì)
HBase中row key用來檢索表中的記錄,支持以下三種方式:
(1) 通過單個(gè)RowKey訪問:即按照某個(gè)RowKey鍵值進(jìn)行Get操作;
(2) 通過RowKey的Range進(jìn)行Scan:即通過設(shè)置Start RowKey和End RowKey,在這個(gè)范圍內(nèi)進(jìn)行掃描;
(3) 全表掃描:即直接掃描整張表中所有行記錄。
在HBase中,RowKey可以是任意字符串,最大長(zhǎng)度64KB,實(shí)際應(yīng)用中一般為10~100bytes,存為byte[]字節(jié)數(shù)組,一般設(shè)計(jì)成定長(zhǎng)的。
RowKey是按照字典序存儲(chǔ),因此,設(shè)計(jì)RowKey時(shí),要充分利用這個(gè)排序特點(diǎn),將經(jīng)常一起讀取的數(shù)據(jù)存儲(chǔ)到一塊,將最近可能會(huì)被訪問的數(shù)據(jù)放在一塊。
舉個(gè)例子:如果最近寫入HBase表中的數(shù)據(jù)是最可能被訪問的,可以考慮將時(shí)間戳作為RowKey的一部分,由于是字典序排序,所以可以使用Long.MAX_VALUE – timestamp作為RowKey,這樣能保證新寫入的數(shù)據(jù)在讀取時(shí)可以被快速命中。


1.3 Column Family設(shè)計(jì)
不要在一張表里定義太多的column family。目前Hbase并不能很好的處理超過2~3個(gè)Column family的表。因?yàn)槟硞€(gè)Column Family在Flush的時(shí)候,它鄰近的Column Family也會(huì)因關(guān)聯(lián)效應(yīng)被觸發(fā)Flush,最終導(dǎo)致系統(tǒng)產(chǎn)生更多的I/O。

 
1.4 In Memory設(shè)置(可選)
創(chuàng)建表的時(shí)候,可以通過HColumnDescriptor.setInMemory(true)將表放到RegionServer的緩存中,保證在讀取的時(shí)候被cache命中。

  
1.5 版本限制
創(chuàng)建表的時(shí)候,可以通過HColumnDescriptor.setMaxVersions(int maxVersions)設(shè)置表中數(shù)據(jù)的最大版本,對(duì)于一些不是特別重要的數(shù)據(jù),可以設(shè)置setMaxVersions(1)。

  
1.6 數(shù)據(jù)生命周期限制
創(chuàng)建表的時(shí)候,可以通過HColumnDescriptor.setTimeToLive(int timeToLive)設(shè)置表中數(shù)據(jù)的存儲(chǔ)生命期,過期數(shù)據(jù)將自動(dòng)被刪除,例如如果只需要存儲(chǔ)最近兩天的數(shù)據(jù),那么可以設(shè)置setTimeToLive(2 * 24 * 60 * 60)。

1.7 Compact 和Split(可選)

實(shí)際應(yīng)用中,如果有必要可以手動(dòng)觸發(fā)Compact和split。

1.8 采用壓縮(可選)

壓縮需要根據(jù)實(shí)際業(yè)務(wù)和機(jī)器性能來衡量是否要采用犧牲CPU來?yè)Q取存儲(chǔ)上的節(jié)約,并且能節(jié)省I/O和網(wǎng)絡(luò)開銷,可以使用Lzo或Snappy壓縮的方式,大致可以壓縮4~5倍。

2. 讀取優(yōu)

2.1 掃描緩存

在進(jìn)行掃描時(shí)可以設(shè)置一次讀取多條,緩存數(shù)據(jù),減少I/O開銷。代碼實(shí)現(xiàn):

hTable.setScannerCaching(50); // 參數(shù)50表示一次性掃描50條

2.2 掃描指定列

Scan時(shí)指定需要的Column Family,可以減少網(wǎng)絡(luò)傳輸數(shù)據(jù)量,否則默認(rèn)scan操作會(huì)返回整行所有Column Family的數(shù)據(jù)。

  

2.3 釋放資源

通過scan取完數(shù)據(jù)后,記得要關(guān)閉ResultScanner,否則RegionServer可能會(huì)出現(xiàn)問題(對(duì)應(yīng)的Server資源無法釋放)。

  

3. 寫入優(yōu)化 

3.1 寫入緩存

寫入HBase表的時(shí)候最好不要一條一條的寫,采用批量的方式,在代碼里設(shè)置:

hTable.setAutoFlush(false, false); // 不讓hbase自動(dòng)刷新數(shù)據(jù)到數(shù)據(jù)庫(kù)
hTable.setWriteBufferSize(1024 * 1024 * 10);// 緩存大小10M

當(dāng)緩存的數(shù)據(jù)達(dá)到10M的時(shí)候會(huì)觸發(fā)flush操作,另外當(dāng)hTable.flushCommits();或hTable.close();時(shí)也會(huì)flush數(shù)據(jù)到數(shù)據(jù)庫(kù)中。而且Hbase的API中支持?jǐn)?shù)據(jù)已list的方式插入。

 

4. 參數(shù)優(yōu)化

4.1 連接時(shí)間

參數(shù):zookeeper.session.timeout
RegionServer與Zookeeper間的連接超時(shí)時(shí)間,默認(rèn)值:3分鐘(180000ms),我們配置:300000ms(5min)。

4.2 線程數(shù)控制

參數(shù):hbase.regionserver.handler.count
RegionServer的請(qǐng)求處理IO線程數(shù),默認(rèn)值:10,我們配置:200。
 

4.3 split閾值

參數(shù):hbase.hregion.max.filesize
單個(gè)region觸發(fā)split的大小閾值,默認(rèn)值:256M,我們配置:4G。
 

4.4 開啟mslab方案

參數(shù):hbase.hregion.memstore.mslab.enabled
減少因內(nèi)存碎片導(dǎo)致的Full GC,提高整體性能,默認(rèn)值:true。
 

4.5 掃描緩存

參數(shù):hbase.client.scanner.caching
scanner調(diào)用next方法一次獲取的數(shù)據(jù)條數(shù),默認(rèn)值:1。
 

4.6 MemStore大小控制

參數(shù):hbase.regionserver.global.memstore.upperLimit/lowerLimit
hbase.regionserver.global.memstore.upperLimit :防止memstore來不及flush成storefile,堆積對(duì)內(nèi)存占用過大,當(dāng)某region的所有memstore占用大于40%,hbase會(huì)強(qiáng)制block所有的更新(請(qǐng)求)并flush這些memstore釋放內(nèi)存。
hbase.regionserver.global.memstore.lowerLimit 默認(rèn)值就可以,不用調(diào)。

以上是“HBase如何調(diào)優(yōu)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(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