hbase_使用中遇到的问题(reginserver节点挂掉)

时间:2022-02-28 22:26:12

现象:

    新搭建了四台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后问题得以解决。