Hbase 參數配置及優化

jopen 12年前發布 | 42K 次閱讀 分布式/云計算/大數據 HBase

接觸hbase已有半年的時間,查了很多資料,也參考了很多別人心得,也希望把自己的心得以及理解寫出來,我把配置hbase必調的幾個參數寫一下,以及它們的意義。

zookeeper.session.timeout

這個參數的意義是regionserver在zookeeper的會話過期時間,默認是3分鐘,如果regionserver 在zookeeper.session.timeout這個配置的時間沒有去連zookeeper的話,zookeeper會將該 regionserver在zookeeper摘除,不讓該regionserver向提供服務,很多人都該值配置很大,原因是生產環境中 regionserver的內存都配置很大,以擴大memstore和cache的大小,提高性能,但是內存配置大了以后,regionserver在 jvm做一次內存大回收時,時間也會變長,很有可能這個時間超過zookeeper.session.timeout時間,導致regionserver 在jvm回收內存的時候,zookeeper誤以為regionserver掛掉而將regionserver摘除。但我認為該值還是不要配的過大,首先地java已支持cms方式回收內存,每次內存回收的時間不是太長,并且生產環境中,我們也不允許過長時間的服務中斷,配置大了,容易造成一個 regionserver的服務真出現異常時,zookeeper不會切除該regionserver,使得很多請求失敗。

hbase.regionserver.handler.count

regionserver的工作線程數量,默認是10,沒有疑問,官方默認值太小,通常都調到100~200之間,提高regionserver性能。

hbase.regionserver.lease.period

regionserer租約時間,默認值是60s,也有點小,如果你的生產環境中,在執行一些任務時,如mapred時出現lease超時的報錯,那這個時候就需要去調大這個值了。

hfile.block.cache.size

regionserver cache的大小,默認是0.2,是整個堆內存的多少比例作為regionserver的cache,調大該值會提升查詢性能,當然也不能過大,如果你的 hbase都大量的查詢,寫入不是很多的話,調到0.5也就夠了,說到這個值,有一個地方需要說明一下,如果生產環境有mapred任務去scan hbase的時候,一些要在mapred scan類中加一個scan.setCacheBlocks(false),避免由于mapred使用regionserver的cache都被替換,造成hbase的查詢性能明顯下降。

hbase.hregion.memstore.flush.size

一個regionserver的單個region memstore的大小,默認是64M,在hbase結構中,一個regionserver管理多個region,一個region對應一個hlog和多個store,一個store對應多個storefile和一個memstore,這里的 hbase.hregion.memstore.flush.size意思一個region下面的所有store里面的memstore的達到多少時,開始將這些memstore flush到hdfs中去,配置這個值,需要參考一下,平均每個regionserver管理的region數量,如果每臺regionsever管理的 region不多的話,可以適當的調大該值,如512M時再flush。

hbase.regionserver.global.memstore.upperLimit/hbase.regionserver.global.memstore.lowerLimit

配置一臺regionserver所有memstore占整個堆的最大比例,默認是0.4/0.35,二個值的差異在于是做局部的flush,還是全部flush,如果你的regionserver日志中,頻發出現因為超過 hbase.regionserver.global.memstore.lowerLimit而做flush的信息,我覺得有必要調小 hbase.hregion.memstore.flush.size,或者適當調大這二個值,當然 hbase.regionserver.global.memstore.upperLimit和hfile.block.cache.size的和不能大于1,到0.8我覺得已經夠大了。如果你的jvm內存回收是使用cms的話,有一個值 CMSInitiatingOccupancyFraction(內存使用到時多少時,一始cms回收內存)的大小和覺得和這個有關系,略小于 hbase.regionserver.global.memstore.upperLimit和hfile.block.cache.size的和是一個不錯的選擇。

hbase.hstore.compactionThreshold/hbase.hregion.majorcompaction

hbase.hstore.compactionThreshold執行compaction的store數量,默認值是3,如果需要提高查詢性能,當然是storefile的數量越小,性能越好,但是執行compaction本身有性能資源的開消,如果regionserver頻繁在 compacion對性能影響也很大。hbase.hregion.majorcompaction表示majorcompaction的周期,默認是1 天,majorcompaction與普通的compaction的區別是majorcompaction會清除過期的歷史版本數據,同時合并 storefile,而普通的compaction只做合并,通常都是majorcompaction,調為0,然后手工定期的去執行一下 majorcompaction,適當調小點compacionThreshold。

hbase.hregion.max.filesize

一個regionsever的最大值,默認是256M,如果數據量特別大的話,調大該值可以減少region的數量,調到2G我覺得都不為過。

hbase配置調優太多,jvm,mslab內存管理以及hdfs append方式等等,需要太多的知識面,很多東西,我也在學習之中,先寫這么多。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!