hbase守護進程及內存調優

一、HMaster安全

          HMaster的任務前面已經說過了,兩個大方向:1、管理Hbase Table的 DDL操做 2、region的分配工做,任務不是很艱鉅,可是若是採用默認自動split region的方式,     HMaster會稍微忙一些,負載不大,可適度對此進程作適量放大heap 的操做,但不可太大,由於更耗內存的是HRegionServer服務器

     二、HRegionServer網絡

          這個進程是HBase中的核心守護進程,原則上是每一個slave啓動一個HRegionServer,但多種狀況可能致使HRegionServer 意外退出,下面舉幾個簡單的方面:session

  •  

    •  網絡很差,致使RegionServer 和 HMaster通訊超時,RegionServer被認爲已經掛掉,從而退出集羣 --網絡問題,沒法從軟件方面解決,關於通訊超時的設置下面作個簡單介紹併發

    •  Java full GC ,這個過程會block全部的線程,若是此事件過長,致使Session expired 會話過時,致使退出集羣--下文會闡述分佈式

    •  各節點時間不一致,致使RegionServer 退出。-- hbase.master.maxclockskew 增大容忍度,默認是30s,但不要太大,畢竟時間不一致是不正常現象,可將全部節點和同一服務器時間作同步,也能夠和時間服務器同步spa

          第一種狀況 和其它緣由致使的RegionServer 超時掛掉的問題,咱們要首先要調高Session的容忍度,默認180000其實這個回話有效期已經夠長的了,可是有的集羣是能夠線程

   下降了這個值,可能會形成Session 超時,這個參數是 zookeeper.session.timeout 默認18000。server

          針對上面這個參數,有的博文認爲即便設爲180000也不能真正的達到目的,由於zookeeper 會將minSessionTimeout 設爲 2*ticktimes ,而將maxSessionTimeout 設爲對象

   20*ticktimes 當 zookeeper.session.timeout 設置超過20*ticktimes 的時候,系統會取 min(zookeeper.session.timeout,20*ticktimes) 來出來。

          針對上述觀點,我從源碼中找到告終論,首先若是是分佈式的Hbase那 會啓動HQuorumPeer 進程 看下這個源碼:

  •  

    •           HQuorumPeer.main 方法中會調用 writeMyID(zkProperties) ,而就在此方法中已經將 maxSessionTimeout設置爲 zookeeper.session.timeout 的時長。

    •           調用HQuorunPeer.runZKServer

    •           調用QuorumPeerMain.runFromConfig

    •           設置quorumPeer.setMaxSessionTimeout(config.getMaxSessionTimeout());

    •           由此可看此件並無直接和tickTime對比的機會。卻是minSessionTimeout沒有設置,默認是2*ticktime

          因而可知 其實若是設置了Zookeeper.session.timeout的話 不會輕易去截取20*ticktime,再不信能夠用echo conf|nc zserver 2181 看一下 zookeeper系統參數

          第二種狀況是要討論的,致使產生這個問題的主要緣由是不少,產生的情景不少,好比在作 major compact的過程當中,時間過長,致使Full GC等,那就儘可能去減小這種情

   況的發生。二個方面

  •  

    •   適度增大守護進程的HeapSize

    •   調整內存回收參數

          第一個方面:Hbase 默認各守護進程爲1G  在hbase-env.sh中有配置 export HBASE_HEAPSIZE=1000,當咱們啓動hbase各守護進程的時候,那全部的hbase守護進程都

     將是1000的heapsize,對於有的進程,夠用,但有些進程取遠遠不夠,咱們能夠考慮增大此參數,好比export HBASE-HEAPSIZE=6000 那就把守護進程的heap 內存調大到

     6G,可是這樣會有問題,有些進程不須要這麼多,雖然設置的比較大不影響內存的實際佔用,但卻混淆了對各進程內存佔用的認識。因此上述參數不作改變,在下面的參數中

     修改守護進程Heap 內存。

  •  

    • export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS $HBASE_JMX_BASE -Xmx2000m -Xms2000m -Xmn750m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70"

  •  

    • export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS $HBASE_JMX_BASE -Xmx6000m -Xms6000m -Xmn2250m -XX:+UseParNewGC 

                    -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70"

  •  

    • export HBASE_THRIFT_OPTS="$HBASE_THRIFT_OPTS $HBASE_JMX_BASE -Xms100m -Xmx2000m"

    • export HBASE_ZOOKEEPER_OPTS="$HBASE_ZOOKEEPER_OPTS $HBASE_JMX_BASE -Xms100m -Xmx2000m"

            咱們分別對各守護進程設置堆內存 其中-Xmx 表示最大可用內存,-Xms表示出事分配內存 -Xmn 表示 年輕代堆內存分配,這個值網上有的建議按照3/3 總heapsize來設

     置,由於是經驗值,暫沒法考證合理性,更多詳細的堆內存分配參數,本地不作過多闡述,後面有機會可作一個單元來解釋。那其它參數是什麼意思呢?

     -XX:+UseParNewGC 等,這就到了咱們說的第二個方面:

            第二個方面:調整內存回收參數,好比-XX:+UseParNewGC 表示年輕帶內存回收策略採用併發收集,此參數在JDK5.0已經自動配置,不需再手動配置;

     -XX:+UseConcMarkSweepGC 表示年老代併發收集;

     -XX:+CMSInitiatingOccupancyFraction表示年老代內存佔用超過此比例即開始作CMS,這個參數很重要在JDK 5.0之後此值默認是90 也就是當年老代對內存佔用90%以上時,

     纔開始作內存收集,而此時剩餘的10%依然接受從年輕代遷移過來的對象,遷移過快,致使年老代heap 100%時,Full GC 即開始,纔是會暫停全部的任務,直至Full GC 完

     成,此時是形成RegionServer 意外退出的元兇,那爲了安全起見,在調大堆內存的狀況下 蔣此值下降到一個較低的閥值,減小Full GC的產生,那我建議此值設70%。

          三、HQuorumPeer 

               此守護集成是Zookeeper的守護進程,由於咱們用的是Hbase內置的ZooKeeper 因此此進程啓動過程當中,會讀取hbase-env.sh 因此守護進程對內存和 HBASE-HEAPSIZE

     的一致,因此也應在hbase-env.sh中合理設置,見HRegionServer 小節中的參數設置方法。

          四、ThriftServer

               同上

相關文章
相關標籤/搜索