Hbase启动时报错ERROR [main] zookeeper.RecoverableZooKeeper: ZooKeeper exists failed after 4 attempts

本文介绍了HBase启动过程中遇到的问题及解决方法,包括2181端口冲突的处理和Zookeeper节点清理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刚安装时尝试启动了HBASE是没问题的,相关配置详见:https://blog.youkuaiyun.com/ls_6468/article/details/79637680?tdsourcetag=s_pcqq_aiomsg

第二次启动出现问题。

2019-04-08 11:31:38,638 ERROR [main] zookeeper.RecoverableZooKeeper: ZooKeeper exists failed after 4 attempts
2019-04-08 11:31:38,639 WARN  [main] zookeeper.ZKUtil: hconnection-0x71e35c40x0, quorum=slave:2181,master:2181, baseZNode=/hbase Unable to set watcher on znode (/hbase/hbaseid)
org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /hbase/hbaseid
	at org.apache.zookeeper.KeeperException.create(KeeperException.java:99)
	at org.apache.zookeeper.KeeperException.create(KeeperException.java:51)
	at org.apache.zookeeper.ZooKeeper.exists(ZooKeeper.java:1041)
	at org.apache.hadoop.hbase.zookeeper.RecoverableZooKeeper.exists(RecoverableZooKeeper.java:222)
	at org.apache.hadoop.hbase.zookeeper.ZKUtil.checkExists(ZKUtil.java:481)
	at org.apache.hadoop.hbase.zookeeper.ZKClusterId.readClusterIdZNode(ZKClusterId.java:65)
	at org.apache.hadoop.hbase.client.ZooKeeperRegistry.getClusterId(ZooKeeperRegistry.java:86)
	at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.retrieveClusterId(ConnectionManager.java:849)
	at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.<init>(ConnectionManager.java:670)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at org.apache.hadoop.hbase.client.ConnectionFactory.createConnection(ConnectionFactory.java:238)
	at org.apache.hadoop.hbase.client.ConnectionFactory.createConnection(ConnectionFactory.java:218)
	at org.apache.hadoop.hbase.client.ConnectionFactory.createConnection(ConnectionFactory.java:119)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.jruby.javasupport.JavaMethod.invokeDirectWithExceptionHandling(JavaMethod.java:450)
	at org.jruby.javasupport.JavaMethod.invokeStaticDirect(JavaMethod.java:362)
	at org.jruby.java.invokers.StaticMethodInvoker.call(StaticMethodInvoker.java:58)
	at org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:312)
	at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:169)
	at org.jruby.ast.CallOneArgNode.interpret(CallOneArgNode.java:57)
	at org.jruby.ast.InstAsgnNode.interpret(InstAsgnNode.java:95)
	at org.jruby.ast.NewlineNode.interpret(NewlineNode.java:104)
	at org.jruby.ast.BlockNode.interpret(BlockNode.java:71)
	at org.jruby.evaluator.ASTInterpreter.INTERPRET_METHOD(ASTInterpreter.java:74)
	at org.jruby.internal.runtime.methods.InterpretedMethod.call(InterpretedMethod.java:169)
	at org.jruby.internal.runtime.methods.DefaultMethod.call(DefaultMethod.java:191)
	at org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:302)
	at org.jruby.runtime.callsite.CachingCallSite.callBlock(CachingCallSite.java:144)
	at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:148)
	at org.jruby.RubyClass.newInstance(RubyClass.java:822)
	at org.jruby.RubyClass$i$newInstance.call(RubyClass$i$newInstance.gen:65535)
	at org.jruby.internal.runtime.methods.JavaMethod$JavaMethodZeroOrNBlock.call(JavaMethod.java:249)
	at org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:292)
	at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:135)
	at opt.hbase_minus_1_dot_0_dot_0_minus_cdh5_dot_6_dot_0.bin.hirb.__file__(/opt/hbase-1.0.0-cdh5.6.0/bin/hirb.rb:131)
	at opt.hbase_minus_1_dot_0_dot_0_minus_cdh5_dot_6_dot_0.bin.hirb.load(/opt/hbase-1.0.0-cdh5.6.0/bin/hirb.rb)
	at org.jruby.Ruby.runScript(Ruby.java:697)
	at org.jruby.Ruby.runScript(Ruby.java:690)
	at org.jruby.Ruby.runNormally(Ruby.java:597)
	at org.jruby.Ruby.runFromMain(Ruby.java:446)
	at org.jruby.Main.doRunFromMain(Main.java:369)
	at org.jruby.Main.internalRun(Main.java:258)
	at org.jruby.Main.run(Main.java:224)
	at org.jruby.Main.run(Main.java:208)
	at org.jruby.Main.main(Main.java:188)
2019-04-08 11:31:38,649 ERROR [main] zookeeper.ZooKeeperWatcher: hconnection-0x71e35c40x0, quorum=slave:2181,master:2181, baseZNode=/hbase Received unexpected KeeperException, re-throwing exception
org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /hbase/hbaseid

都知道HBASE是基于zookeeper的,而zookeeper是基于Hadoop的,启动了Hadoop后我们总会启动zookeeper再启动HBASE,其中注意到配置时在hbase-env.sh文件中有如下设置

cd /opt/hbase-1.0.0-cdh5.6.0/conf
vi hbase-env.sh

添加如下:

export JAVA_HOME=/opt/jdk1.7.0_71    //Java安装路径
export HBASE_LOG_DIR=/opt/hbase-1.0.0-cdh5.6.0/logs    //hbase日志存放路径,没有的话会自动创建
export HADOOP_HOME=/opt/hadoop-2.6.0-cdh5.6.0         //Hadoop安装路径
export HBASE_MANAGES_ZK=false       //true为使用自带的zookeeper

那么说明HBASE内是自带zookeeper的,这就可能会出现情况 ,在你配置是是否使用了hbase自带的zookeeper或者是自己安装的zookeeper。端口2181是否被抢占。

解决方法:
1).hbase-env.sh 将 export HBASE_MANAGES_ZK 属性设置为false

export HBASE_MANAGES_ZK=false
以下也可以导致这个问题:

1、netstat -antp | fgrep 2181,就知道端口被什么进程占了

2、已经启动ZK,但是HBase并没有使用外部的ZK,导致冲突

那么根据报错,确实是2181端口出了问题,至于是什么导致的不知道,于是使用命令

netstat -antp | fgrep 2181

或者用lsof命令查询{可能有的机器没有装netstat}

找出到底是谁占用了我的端口

结果

[master@master bin]$ netstat -antp | fgrep 2181
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 :::2181                     :::*                        LISTEN      3829/java       

确实占用了这个端口
然后执行:kill -9 3829
杀死该进程。
重新启动HBASE,问题解决!

总结一下,得到的教训是,hbase自带zookeeper服务,因此配置时注意选择用自己安装的还是hbase自带的,若用自带的,可以不用启动zookeeper,否则每次启动hbase前要自行启动zookeeper,而hbase自带的zookeeper会在启动hbase时自动启动所有节点的zookeeper服务

之后成功登入HBASE,但是查表时出现错误,并且显示znode==null的内容,检查jps发现HMaster消失,检查后发现启动hbase服务后能成功启动HMaster进程,但是登入hbase后HMaster自动消失,于是判定为使Master上的服务有问题。

解决方案
1、进入zookeeper的bin目录;

2、执行客户端脚本:$sh zkCli.sh

3、查看Zookeeper节点信息: ls /

4、递归删除hbase节点:rmr /hbase

5、退出:quit

6、重启Zookeeper

或者

#1、直接启动客户端脚本

[root@master ~]# zkCli.sh

#2、查看Zookeeper节点信息

[zk: localhost:2181(CONNECTED) 0] ls /

#3、递归删除hbase节点

[zk: localhost:2181(CONNECTED) 1] rmr /hbase

#4、退出客户端

[zk: localhost:2181(CONNECTED) 2] quit

#5、重启Zookeeper服务

[root@master ~]# zkServer.sh stop
[root@master ~]# zkServer.sh start
<think>我们正在处理HBaseHMaster启动失败的问题。用户提供的日志显示HMaster因未处理的异常而关闭,具体是StandbyException,表明尝试在备用NameNode上执行读操作。此外,用户之前的命令涉及环境变量设置错误(如$HADOOP_HOME应为$HADOOP_HOME,中间有空格导致错误),以及可能的JLine版本冲突。另外,引用[3]提到了磁盘空间不足的问题。根据引用[1]和[2]:HMaster因StandbyException而终止,这通常发生在HBase尝试从HDFS读取数据时,但连接的NameNode处于备用状态。HBase需要与活跃的NameNode通信。根据引用[3]:Ambari部署中HBaseMaster启动后消失,原因是/boot分区空间不足(只有200M),导致HBase无法创建本地目录和加载jar文件。综合以上,我们分析HMaster启动失败的可能原因:1.HDFSNameNode的高可用(HA)状态问题:HBase配置的HDFS地址可能指向了备用NameNode,或者当前没有活跃的NameNode。2.环境变量问题:之前用户执行命令时,环境变量引用有误(如$HADOOP_HOME,中间有空格),可能导致一些配置或脚本无法正确找到路径。3.JLine版本冲突:用户之前尝试替换JLine包,但命令执行失败(因为环境变量引用错误),可能导致JLine版本冲突问题依然存在。4.磁盘空间不足:如果HBase的本地目录所在分区空间不足,会导致进程启动失败。因此,我们按照以下步骤进行排查和解决:###步骤1:检查HDFSHA状态确保HBase配置的HDFS地址指向正确的NameNode,并且有活跃的NameNode。1.确认HadoopHA状态:```bashhdfshaadmin-getServiceStatenn1#将nn1替换为你的NameNodeIDhdfshaadmin-getServiceStatenn2```应该有一个是active。2.如果发现两个都是standby,需要手动切换一个为active:```bashhdfshaadmin-transitionToActive--forcemanualnn1```3.检查HBase的`hbase-site.xml`中`hbase.rootdir`配置的HDFS地址是否为正确的NameService:```xml<property><name>hbase.rootdir</name><value>hdfs://mycluster/hbase</value><!--使用NameServiceID--></property>```###步骤2:修复环境变量问题在之前的命令中,用户使用了`$HADOOP_HOME`(有空格),这会导致命令执行失败。确保在命令中正确引用环境变量(无空格):```bash#正确写法cp/usr/apps/hive/hive-1.2.1/lib/jline-2.12.jar$HADOOP_HOME/share/hadoop/yarn/lib/```###步骤3:解决JLine版本冲突1.删除Hadoop和HBase中除jline-2.12.jar之外的其他jline版本:```bash#删除Hadoop中其他版本的jlinefind$HADOOP_HOME-name"jline-*.jar"-not-name"jline-2.12.jar"-delete#删除HBase中其他版本的jlinefind$HBASE_HOME-name"jline-*.jar"-not-name"jline-2.12.jar"-delete```2.确保jline-2.12.jar已复制到正确位置:```bashcp/usr/apps/hive/hive-1.2.1/lib/jline-2.12.jar$HADOOP_HOME/share/hadoop/yarn/lib/cp/usr/apps/hive/hive-1.2.1/lib/jline-2.12.jar$HBASE_HOME/lib/```###步骤4:检查磁盘空间1.检查HBase配置的本地目录(`hbase.tmp.dir`,默认是`/tmp/hbase-${user.name}`)所在分区的磁盘空间:```bashdf-h/tmp#如果默认目录在/tmp```2.如果磁盘空间不足:-清理磁盘空间(删除不必要的文件或日志)-或者修改HBase的本地临时目录到空间充足的分区:在`hbase-site.xml`中添加:```xml<property><name>hbase.tmp.dir</name><value>/path/to/disk_space_sufficient_dir</value></property>```###步骤5:重启HBase并查看日志完成以上步骤后,重启HBase:```bashstop-hbase.sh#如果已经启动过,先停止start-hbase.sh```查看HMaster日志,确认启动是否成功:```bashtail-f$HBASE_HOME/logs/hbase-*-master-*.log```###常见错误排查-如果日志中出现`ClassNotFoundException`或`NoClassDefFoundError`,可能是依赖包缺失或冲突,检查相关jar包。-如果出现HDFS权限问题,确保HBase运行用户有权限访问HDFS上的HBase目录(`hbase.rootdir`)。-如果出现ZooKeeper连接问题,检查ZooKeeper服务状态和配置。###相关问题§§相关问题§§1.如何配置Hadoop高可用(HA)?2.HBase启动过程中常见的磁盘问题有哪些?3.如何解决HBase中的依赖冲突?4.HBase的日志文件如何分析?5.如何调整HBase的配置以避免内存溢出?</think>### HBase HMaster 启动失败排查与日志分析 根据您提供的日志信息和常见故障模式,以下是完整的排查解决方案: --- #### **核心错误分析** 1. **`StandbyException` 关键错误** ```log FATAL [master:bigdata-pro01:60000] master.HMaster: Unhandled exception... org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.StandbyException): Operation category READ is not supported in state standby ``` - **根本原因**:HBase 尝试从 **备用状态(Standby)的 NameNode** 读取数据,但 HBase 必须连接**活跃状态(Active)的 NameNode**[^1] - 触发场景: - HDFS 高可用(HA)配置错误 - NameNode 自动切换失败 - ZooKeeper 状态不一致 2. **环境变量问题**(前期命令中的错误) ```bash cp: 目标 &#39;HADOOP_HOME/share/hadoop/yarn/lib/&#39; 不是目录 find: ‘$’: 没有那个文件或目录 ``` - 表明环境变量 `$HADOOP_HOME` 和 `$HBASE_HOME` **未正确定义**(变量名与路径间有空格) 3. **磁盘空间隐患**(潜在风险) ```log create local dir /boot/efi/hadoop/hbase/local/jars... 内存溢出 ``` - HBase 启动需要至少 **1GB 临时空间**,系统盘空间不足会导致进程崩溃[^3] --- ### 完整解决方案 #### **步骤 1: 修复环境变量配置** ```bash # 检查环境变量定义 echo $HADOOP_HOME # 正确应显示路径如 /opt/hadoop echo $HBASE_HOME # 正确应显示路径如 /opt/hbase # 若未定义,添加到 ~/.bashrc echo "export HADOOP_HOME=/your/hadoop/path" >> ~/.bashrc echo "export HBASE_HOME=/your/hbase/path" >> ~/.bashrc source ~/.bashrc ``` #### **步骤 2: 解决 NameNode 状态问题** ```bash # 1. 检查 NameNode 状态 hdfs haadmin -getServiceState nn1 # nn1 替换为你的NameNode ID hdfs haadmin -getServiceState nn2 # 2. 手动激活 NameNode (若发现两个都是standby) hdfs haadmin -transitionToActive --forcemanual nn1 # 3. 验证 HBase 配置 grep -A1 &#39;hbase.rootdir&#39; $HBASE_HOME/conf/hbase-site.xml # 正确示例:<value>hdfs://active-namenode:8020/hbase</value> ``` #### **步骤 3: 修复 JLine 冲突(正确方式)** ```bash # 删除冲突版本(使用正确环境变量) find $HADOOP_HOME -name "jline-*.jar" ! -name "jline-2.12.jar" -delete find $HBASE_HOME -name "jline-*.jar" ! -name "jline-2.12.jar" -delete # 复制正确版本 cp /usr/apps/hive/hive-1.2.1/lib/jline-2.12.jar $HADOOP_HOME/share/hadoop/yarn/lib/ cp /usr/apps/hive/hive-1.2.1/lib/jline-2.12.jar $HBASE_HOME/lib/ ``` #### **步骤 4: 检查磁盘空间** ```bash # 检查 HBase 临时目录空间(默认 /tmp) df -h /tmp # 若空间不足: # 方案1: 清理旧数据 sudo find /tmp -name "hbase-*" -mtime +3 -exec rm -rf {} \; # 方案2: 修改临时目录(在 hbase-site.xml 中添加) <property> <name>hbase.tmp.dir</name> <value>/new/path/with/space</value> <!-- 确保有10GB+空间 --> </property> ``` #### **步骤 5: 重启服务与日志验证** ```bash # 按顺序重启 stop-hbase.sh stop-yarn.sh stop-dfs.sh start-dfs.sh start-yarn.sh start-hbase.sh # 监控 HMaster 日志 tail -f $HBASE_HOME/logs/hbase-*-master-*.log | grep -E "ERROR|FATAL|WARN" # 成功标志应出现: # "Master has completed initialization" ``` --- ### 关键配置检查项 在 `hbase-site.xml` 中确认: ```xml <!-- 确保指向 ACTIVE NameNode --> <property> <name>hbase.rootdir</name> <value>hdfs://active-nn-hostname:8020/hbase</value> </property> <!-- ZooKeeper 集群配置 --> <property> <name>hbase.zookeeper.quorum</name> <value>zk1,zk2,zk3</value> </property> <!-- 避免备用节点干扰 --> <property> <name>hbase.master.info.port.ignore</name> <value>true</value> </property> ``` --- ### 高级故障排查 若仍失败,使用 **HBase 调试模式**: ```bash # 1. 启用 DEBUG 日志 echo "export HBASE_ROOT_LOGGER=DEBUG,console" >> $HBASE_HOME/conf/hbase-env.sh # 2. 单节点启动 HMaster hbase-daemon.sh start master --foreground # 3. 检查类加载冲突 java -verbose:class -jar $HBASE_HOME/lib/hbase-server-*.jar 2>&1 | grep jline ``` --- ### 预防措施 1. **HA 监控脚本**(定时检查 NN 状态) ```bash #!/bin/bash ACTIVE_NN=$(hdfs haadmin -getServiceState nn1 | grep Active) [ -z "$ACTIVE_NN" ] && hdfs haadmin -transitionToActive --forcemanual nn1 ``` 2. **磁盘空间告警** ```bash # 添加到 crontab (每天检查) df -h /tmp | awk &#39;NR==2{ if ($5 > 90) system("alert-disk-space.sh") }&#39; ``` 3. **版本兼容矩阵** | HBase 版本 | Hadoop 版本 | JLine 版本 | |------------|-------------|------------| | 2.4.x | 3.3.x | 2.12.x | | 2.5.x | 3.3.x | 3.x | > 通过上述步骤,95%的 HMaster 启动失败问题可解决。若问题持续,需检查 ZooKeeper 会话超时设置(`zookeeper.session.timeout` 应 ≥ 180000)[^2]。 --- ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值