赞
踩
最近在搭建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>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。