hbase參數(shù)配置及優(yōu)化
接觸hbase已有半年的時(shí)間,查了很多資料,也參考了很多別人心得,也希望把自己的心得以及理解寫出來,我把配置hbase必調(diào)的幾個(gè)參數(shù)寫一下,以及它們的意義。
zookeeper.session.timeout
這個(gè)參數(shù)的意義是regionserver在zookeeper的會(huì)話過期時(shí)間,默認(rèn)是3分鐘,如果regionserver 在zookeeper.session.timeout這個(gè)配置的時(shí)間沒有去連zookeeper的話,zookeeper會(huì)將該regionserver在zookeeper摘除,不讓該regionserver向提供服務(wù),很多人都該值配置很大,原因是生產(chǎn)環(huán)境中regionserver的內(nèi)存都配置很大,以擴(kuò)大memstore和cache的大小,提高性能,但是內(nèi)存配置大了以后,regionserver在jvm做一次內(nèi)存大回收時(shí),時(shí)間也會(huì)變長(zhǎng),很有可能這個(gè)時(shí)間超過zookeeper.session.timeout時(shí)間,導(dǎo)致regionserver在jvm回收內(nèi)存的時(shí)候,zookeeper誤以為regionserver掛掉而將regionserver摘除。但我認(rèn)為該值還是不要配的過大,首先地java已支持cms方式回收內(nèi)存,每次內(nèi)存回收的時(shí)間不是太長(zhǎng),并且生產(chǎn)環(huán)境中,我們也不允許過長(zhǎng)時(shí)間的服務(wù)中斷,配置大了,容易造成一個(gè)regionserver的服務(wù)真出現(xiàn)異常時(shí),zookeeper不會(huì)切除該regionserver,使得很多請(qǐng)求失敗。
hbase.regionserver.handler.count
regionserver的工作線程數(shù)量,默認(rèn)是10,沒有疑問,官方默認(rèn)值太小,通常都調(diào)到100~200之間,提高regionserver性能。
hbase.regionserver.lease.period
regionserer租約時(shí)間,默認(rèn)值是60s,也有點(diǎn)小,如果你的生產(chǎn)環(huán)境中,在執(zhí)行一些任務(wù)時(shí),如mapred時(shí)出現(xiàn)lease超時(shí)的報(bào)錯(cuò),那這個(gè)時(shí)候就需要去調(diào)大這個(gè)值了。
hfile.block.cache.size
regionserver cache的大小,默認(rèn)是0.2,是整個(gè)堆內(nèi)存的多少比例作為regionserver的cache,調(diào)大該值會(huì)提升查詢性能,當(dāng)然也不能過大,如果你的hbase都大量的查詢,寫入不是很多的話,調(diào)到0.5也就夠了,說到這個(gè)值,有一個(gè)地方需要說明一下,如果生產(chǎn)環(huán)境有mapred任務(wù)去scan hbase的時(shí)候,一些要在mapred scan類中加一個(gè)scan.setCacheBlocks(false),避免由于mapred使用regionserver的cache都被替換,造成hbase的查詢性能明顯下降。
hbase.hregion.memstore.flush.size
一個(gè)regionserver的單個(gè)region memstore的大小,默認(rèn)是64M,在hbase結(jié)構(gòu)中,一個(gè)regionserver管理多個(gè)region,一個(gè)region對(duì)應(yīng)一個(gè)hlog和多個(gè)store,一個(gè)store對(duì)應(yīng)多個(gè)storefile和一個(gè)memstore,這里的hbase.hregion.memstore.flush.size意思一個(gè)region下面的所有store里面的memstore的達(dá)到多少時(shí),開始將這些memstore flush到hdfs中去,配置這個(gè)值,需要參考一下,平均每個(gè)regionserver管理的region數(shù)量,如果每臺(tái)regionsever管理的region不多的話,可以適當(dāng)?shù)恼{(diào)大該值,如512M時(shí)再flush。
hbase.regionserver.global.memstore.upperLimit/hbase.regionserver.global.memstore.lowerLimit
配置一臺(tái)regionserver所有memstore占整個(gè)堆的最大比例,默認(rèn)是0.4/0.35,二個(gè)值的差異在于是做局部的flush,還是全部flush,如果你的regionserver日志中,頻發(fā)出現(xiàn)因?yàn)槌^hbase.regionserver.global.memstore.lowerLimit而做flush的信息,我覺得有必要調(diào)小hbase.hregion.memstore.flush.size,或者適當(dāng)調(diào)大這二個(gè)值,當(dāng)然hbase.regionserver.global.memstore.upperLimit和hfile.block.cache.size的和不能大于1,到0.8我覺得已經(jīng)夠大了。如果你的jvm內(nèi)存回收是使用cms的話,有一個(gè)值CMSInitiatingOccupancyFraction(內(nèi)存使用到時(shí)多少時(shí),一始cms回收內(nèi)存)的大小和覺得和這個(gè)有關(guān)系,略小于hbase.regionserver.global.memstore.upperLimit和hfile.block.cache.size的和是一個(gè)不錯(cuò)的選擇。
hbase.hstore.compactionThreshold/hbase.hregion.majorcompaction
hbase.hstore.compactionThreshold執(zhí)行compaction的store數(shù)量,默認(rèn)值是3,如果需要提高查詢性能,當(dāng)然是storefile的數(shù)量越小,性能越好,但是執(zhí)行compaction本身有性能資源的開消,如果regionserver頻繁在compacion對(duì)性能影響也很大。hbase.hregion.majorcompaction表示majorcompaction的周期,默認(rèn)是1天,majorcompaction與普通的compaction的區(qū)別是majorcompaction會(huì)清除過期的歷史版本數(shù)據(jù),同時(shí)合并storefile,而普通的compaction只做合并,通常都是majorcompaction,調(diào)為0,然后手工定期的去執(zhí)行一下majorcompaction,適當(dāng)調(diào)小點(diǎn)compacionThreshold。
hbase.hregion.max.filesize
一個(gè)regionsever的最大值,默認(rèn)是256M,如果數(shù)據(jù)量特別大的話,調(diào)大該值可以減少region的數(shù)量,調(diào)到2G我覺得都不為過。
hbase配置調(diào)優(yōu)太多,jvm,mslab內(nèi)存管理以及hdfs append方式等等,需要太多的知識(shí)面,很多東西,我也在學(xué)習(xí)之中,先寫這么多。
您正在看的文章來自瘋狂軟件教育中心 www.fkjava.org
信息咨詢:Q564205990 星老師