1. 程式人生 > >hbase_使用中遇到的問題(reginserver節點掛掉)

hbase_使用中遇到的問題(reginserver節點掛掉)

現象:

    新搭建了四臺hbase叢集,建立了100多張表,匯入了3000多萬的記錄。在使用過程中,每個小時的第36分鐘其中一個regionserver節點掛掉,另兩個regionserver節點跟著也掛掉。master節點沒問題。

先掛掉的regionserver節點的日誌節選:

2018-06-06 10:35:50,125 WARN  [RpcServer.FifoWFPBQ.default.handler=26,queue=2,port=60040] hfile.LruBlockCache: Trying to cache too large a block cd7871c92e844b01aef319748e9f6c58 @ 537265509 is 33562968 which is larger than 16777216

2018-06-06 10:35:56,641 WARN  [RpcServer.FifoWFPBQ.default.handler=26,queue=2,port=60040] hfile.LruBlockCache: Trying to cache too large a block 4a78a84ff6a44b06a3aaee095e8f04c4 @ 705079166 is 33562952 which is larger than 16777216

2018-06-06 10:36:06,228 INFO  [main] zookeeper.ZooKeeper: Client environment:zookeeper.version=3.4.6

-1569965, built on 02/20/2014 09:09 GMT

2018-06-06 10:36:06,229 INFO  [main] zookeeper.ZooKeeper: Client environment:host.name=hbase2-159

2018-06-06 10:36:06,229 INFO  [main] zookeeper.ZooKeeper: Client environment:java.version=1.8.0_151

2018-06-06 10:36:06,249 INFO  [main-SendThread(hbase1:2181)] zookeeper.ClientCnxn: Opening socket connection to server hbase1/172.21.0.17:2181. Will not attempt to authenticate using SASL

 (unknown error)

2018-06-06 10:36:06,254 INFO  [main-SendThread(hbase1:2181)] zookeeper.ClientCnxn: Socket connection established to hbase1/172.21.0.17:2181, initiating session

2018-06-06 10:36:06,260 INFO  [main-SendThread(hbase1:2181)] zookeeper.ClientCnxn: Session establishment complete on server hbase1/172.21.0.17:2181, sessionid = 0x200cc1d280c000c, negotiated timeout = 60000

Hbasemaster節點日誌:

2018-06-06 10:36:06,268 INFO  [main-EventThread] zookeeper.RegionServerTracker: RegionServer ephemeral node deleted, processing expiration [hbase2,60040,1528249590237]

2018-06-06 10:36:06,384 INFO  [ProcedureExecutor-2] procedure.ServerCrashProcedure: Start processing crashed hbase2,60040,1528249590237

2018-06-06 10:36:06,622 INFO  [ProcedureExecutor-2] master.SplitLogManager: dead splitlog workers [hbase2,60040,1528249590237]

原因分析:

1. hbase日誌中用到的zookeeper版本為3.4.6,而我們安裝zookeeper版本為3.4.11.可能是版本不一致。Hbase用的是1.3.2。但測試環境中也是這些版本都沒問題,因此先排除版本問題。後來把hbaselib目錄下的zk版本從3.4.6改為3.4.11jar包,重啟動後還是這個問題。

2.hbase上面的一個警告,33562968 which is larger than 16777216

<property>  

        <name>hbase.hregion.percolumnfamilyflush.size.lower.bound</name>  

        <value>16777216</value>  

</property>  

當一個 region 中的 memstore 的大小大於這個值的時候,我們又觸發 了 close.會先執行“pre-flush”操作,清理這個需要關閉的 memstore,然後 將這個 region 下線。當一個 region 下線了,我們無法再進行任何寫操作。 如果一個 memstore 很大的時候,flush 操作會消耗很多時間。"pre-flush" 操作意味著在 region 下線之前,會先把 memstore 清空。這樣在最終執行 close 操作的時候,flush 操作會很快。

因為是警告,應該不是根本原因,因此先試別的方案實在不行再來調這個引數。

3. 可能是full gc導致regionserver掛掉

hbase-env.sh中放開輸出GC日誌的配置:

export SERVER_GC_OPTS="-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:<FILE-PATH> -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=1 -XX:GCLogFileSize=512M"

重啟hbase,還是每小時的第36分鐘掛掉,但此時在logs下多了一個.gc日誌,每次掛前都輸出日誌:

[Full GC (Allocation Failure) 2018-06-07T09:39:34.275+0800: 498.085: [CMS: 3379629K->3379626K(3385792K), 0.5449117 secs] 3972463K-> 3972411K (3999232K),  [Metaspace: 44673K->44673K(1089536K)],  0.5450498 secs] [Times: user=0.54 sys=0.00, real=0.55 secs]

看來是full gc引起的。

修改hbase-env.sh中的記憶體配置:

export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -Xmx4g -Xms4g -XX:PermSize=1024m -XX:MaxPermSize=1024m -XX:ReservedCodeCacheSize=1024m"

export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -Xmx12g -Xms12g -Xmn4096M -XX:SurvivorRatio=1 -XX:PermSize=1024M -XX:MaxPermSize=1024M -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv6Addresses=false -XX:MaxTenuringThreshold=15 -XX:+CMSParallelRemarkEnabled -XX:+UseFastAccessorMethods -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=60 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+HeapDumpOnOutOfMemoryError "

因為master節點機器記憶體8G,因此配置了4gregionserver節點記憶體16g,因此配置了12g

重啟hbase後問題得以解決。