黑猴子的家:HBase 之HRegionserver挂死,日志出现Session Expired异常排查

1、编辑hbase-site.xml配置文件

加大zookeeper会话超时时间,编辑hbase-site.xml文件,添加下面的属性

[victor@hadoop102 hbase]# vim conf/hbase-site.xml


    zookeeper.session.timeout
    120000
    加大zookeeper会话超时时间



    hbase.regionserver.restart.on.zk.expire
    true
    设置 regionserver 起死回生



    hbase.master.maxclockskew
    180000
    Time difference of regionserver from master

2、加大zookeeper会话最大超时时间,编辑zoo.cfg

[victor@hadoop102 zookeeper]# vim conf/zoo.cfg
MaxSessionTimeout=120000

[victor@hadoop102 zookeeper]# bin/zkServer.sh restart

3、查看regionserver是否有充足的cpu资源

使用top命令查看regionserver是否有充足的cpu资源,mapreduce会占用很多cpu,可以减少mapreduce任务数

[victor@hadoop102 ~]# top

4、查看swap列,确认没有发生交换

使用vmstat 1 命令查看si so两个swap列,确认没有发生交换,1代表每秒打印一次

[victor@hadoop102 ~]# vmstat 1

5、查看fgct列

使用jstat -gcutil pid 1000 查看fgct列,确认regionserver没有发生长时间gc暂停,如果gc时间超过zookeeper的连接最大超时时间则会导致hbase挂掉

[victor@hadoop102 ~]# jstat -gcutil pid 1000

hbase中和GC相关的参数

export HBASE_OPTS="$HBASE_OPTS -ea -verbose:gc -Xloggc:$HBASE_LOG_DIR/hbase.gc.log -XX:ErrorFile=$HBASE_LOG_DIR/hs_err_pid.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode"

修改后

export HBASE_OPTS="$HBASE_OPTS -verbose:gc -Xloggc:$HBASE_LOG_DIR/hbase.gc.log -XX:ErrorFile=$HBASE_LOG_DIR/hs_err_pid.log -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:CMSInitiatingOccupancyFraction=70"

RegionServer 由于 ZooKeeper session expired 而退出,头疼了很久,总结可能的原因:

6、RegionServer 由于 ZooKeeper session expired 而退出,可能发生的原因

(1)网络不好
(2)GC时间过长,程序暂停导致租约过期
(3)CPU忙,维护zookeeper的线程不能及时得到执行机会(调度)
(4)服务器时间同步问题

7、zookeeper Session 时间如何计算

zookeeper的maxSessionTimeout默认值导致hbase regionserver超时
在hbase中经常会遇到regionserver挂掉的情况,查看日志会看到这样的错误信息

WARN  [master/hadoop02/192.168.100.5:6000] zookeeper.ZKUtil: master:6000-0x3525df55101a556, quorum=hadoop02:2181,hadoop03:2181,hadoop01:2181, baseZNode=/hbase Unable to get data of znode /hbase/xx
org.apache.zookeeper.KeeperException$SessionExpiredException: KeeperErrorCode = Session expired for /hbase/xx
        at org.apache.zookeeper.KeeperException.create(KeeperException.java:127)
        at org.apache.zookeeper.KeeperException.create(KeeperException.java:51)
        at org.apache.zookeeper.ZooKeeper.getData(ZooKeeper.java:1155)
        at org.apache.hadoop.hbase.zookeeper.RecoverableZooKeeper.getData(RecoverableZooKeeper.java:359)
        at org.apache.hadoop.hbase.zookeeper.ZKUtil.getData(ZKUtil.java:745)

说明与zookeeper的连接的session超时了,可是在hbase-site.xml中设置了zookeeper的超时时间为2分钟,原来
zookeeper中自带两个参数设置了session的超时时间,在启动时日志中会显示

INFO  [main:QuorumPeer@992] - tickTime set to 2000
INFO  [main:QuorumPeer@1012] - minSessionTimeout set to -1
INFO  [main:QuorumPeer@1023] - maxSessionTimeout set to -1

而minSessionTimeout 和maxSessionTimeout 是用下面的方式算出来的
Session

public int getMinSessionTimeout()
{ return minSessionTimeout == -1 ? tickTime * 2 : minSessionTimeout; } 
public int getMaxSessionTimeout() 
{ return maxSessionTimeout == -1 ? tickTime * 20 : maxSessionTimeout; }

Session 默认情况,tickTime=2sec,那么minSessionTimeout 和 maxSessionTimeout 分别是4sec和40sec

所以在hbase中设置超时时间是没用的,必须修改zookeeper自身的maxSessionTimeout为120000,才能真正起到加长zookeeper的session超时时间的作用

你可能感兴趣的:(黑猴子的家:HBase 之HRegionserver挂死,日志出现Session Expired异常排查)