HBase高可用集群踩坑总结

最近在搭建HBase的高可用集群,看似不复杂的事情,前前后后在HMaster启动后会自动关闭(Master is initializing) 这件事上处理了好久。

究其原因一个是HBase集群中会出现的问题比较多,问题堆在一起的时候,刚开始接触HBase的朋友确不容易发现真正的问题在哪里,还有就是自己还是有点懒了,没有好好地去读官方的说明文档,其实官网上对一些参数的配置讲解的还是比较详细的。

下面总结一下这几天从入门到放弃到搭建成功踩过的一些坑。

注意: 我的这些方法比较适用于集群中数据没那么重要的情况,或者说更多适用于一开始搭建的集群,对于里面有重要数据的集群,要特别小心里面一些对数据的删除和初始化操作。

坑一:
高可用的hadoop中,rootidr的值没有设置成和hdfs-site.xml中的nameservices的值一致
报错:

这个我一开始就配置上了,所以不太清楚log会报什么错,但是具体体现一般就是集群无法正常启动,HMaster启动几秒就关掉了

解决方法如上所说:
将hbase-site.xml 中 hbase:rootdir这里 中间的名字不要端口号,并且改为和hdfs-site.xml中一致,比如我这里原来是Master1:9000 因为用的是 HA Hadoop所以改为 hadoop zookeeper集群的id myhadoop同hdfs-site.xml一致

<property>
    <name>hbase.rootdir</name>
    <value>hdfs://myhadoop/hbase</value>
</property>

坑二:
现象同解决方法:
etc/hadoop中的hdfs-site.xml和core-site.xml没有放到hbase/conf里,放入即可
报错同坑一

坑三:
现象以及报错:

master.HMaster: Failed to become active master
java.io.IOException: error or interrupted while splitting logs in [hdfs://myhadoop/hbase/WALs/slave2,16020,1589941799393-splitting] Task = installed = 1 done = 0 error = 1

解决方法:这个是由于之前异常退出的时候残留的WALs里的文件,导致的错误,可以用命令

hdfs dfs -rm -r /hbase/WALs/*

将里面的文件删除或者如果有重要文件不能随便删除,可以删除后缀带splitting的文件,有重要文件的朋友,慎重删除文件,或者最好备份

坑四:
报错及现象:

zookeeper.MetaTableLocator: Failed verification of hbase:meta,1 at address=slave2,16020,1589941799393, exception=org.apache.hadoop.hbase.NotServingRegionException: Region hbase:meta,1 is not online on slave2,16020,1589945926942

这个是由于异常退出的时候zookeeper集群里的残留文件导致的错误,解决方法就是 到zookeeper的bin下面 启动 zkServer.sh

ls /
rmr /hbase

同样,慎重删除文件

坑五:
报错及现象:

hdfs.DFSClient: DataStreamer Exception
org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /hbase/MasterProcWALs/state-00000000000000000054.log could only be replicated to 0 nodes instead of minReplication (=1). There are 3 datanode(s) running and no node(s) are excluded in this operation.

这个问题我一开始的时候以为是MasterProcWALs文件夹下的文件需要删除,后面反反复复地删了很多次还是报错,觉得应该不是这个问题。后面才知道,是因为在配置高可用集群的时候需要在hbase-site.xml加这么一项

<property>
	<name>hbase.unsafe.stream.capability.enforce</name>
	<value>false</value>
</property>

加了之后成功启动HBase

总结:
出了错误要及时去hbase/logs下查看对应的log,查看真正的错误在哪里,同时,如前面所说这里许多问题会交替出现,有时候很难理清楚,经过反反复复地实验,我总结下来一个大概的顺序,按照这个顺序大概可以排除掉我上面说的这些错误,虽然有点繁琐,但是如果对于原理不够熟悉,按照这个顺序来启动测试,应该来说比较有利于发现问题,解决问题

1、正确配置HBase(一般来说可以更改了HBase配置不需要重启 Hadoop,重启HBase即可)
2、正常启动Hadoop集群
3、可以尝试检验一下Hadoop集群有没有正常启动 比如可以用share/hadoop/mapreduce下的计算pi的例程测试一下能不能正常计算pi值
4、启动hbase之前,先用上面提到的zkServer.sh清空一下/hbase文件
5、再按上面说的 hdfs里面清空一下/hbase/WALs
6、启动HBase

最后贴出一下我使用的hbase-site.xml文件,网上的配置有各种各样,我这份是实测可以使用的,有需要的可以参照着配置,至于hbase-env.sh文件我的经验是注意配置JAVA_HOME虚拟机,记得关掉HBase自带的zookeeper是重点
hbase-site.xml

<configuration>
<!-- 设置HRegionServers共享目录,请加上端口号 -->
  <property>
    <name>hbase.rootdir</name>
    <value>hdfs://myhadoop/hbase</value>
  </property>

   <property>
         <name>hbase.cluster.distributed</name>
          <value>true</value>
        </property>
   <!-- 指定zk的地址,多个用“,”分割 -->
        <property>
                <name>hbase.zookeeper.quorum</name>
                <value>Master1:2181,Master2:2181,Master3:2181</value>
        </property>

	<!-- 指定独立Zookeeper数据路径 -->
  	<property>
    	<name>hbase.zookeeper.property.dataDir</name>
    	<value>/usr/local/hadoop/zookeeper-3.4.14/data/zkData</value>
  	</property>

	<property>
        <name>hbase.tmp.dir</name>
        <value>/usr/local/hadoop/hbase/tmp</value>
    	</property>
	
	 <!-- ZooKeeper 会话超时。Hbase 把这个值传递给 zk 集群,向它推荐一个会话的最大超时时间 -->
    	<property>
        <name>zookeeper.session.timeout</name>
        <value>120000</value>
    	</property>
 
	<!-- 指定ZooKeeper集群端口 -->
  	<property>
    	<name>hbase.zookeeper.property.clientPort</name>
    	<value>2181</value>
  	</property>
	
	<property>
            <name>hbase.regionserver.restart.on.zk.expire</name>
            <value>true</value>
        </property>

	<property>
	<name>hbase.unsafe.stream.capability.enforce</name>
	<value>false</value>
	</property>
</configuration>