HMaster自动关闭问题真的把我给整神了,美滋滋把hbase搭建完,hbase shell进入到hbase之后却不能用。
之后发现是HMaster这个节点在启动后会自动关闭。
这次的错误我也学习到了log日志的重要性,日志里会包含一些error啥的,把这些日志的后面部分放到AI里问问。
1.根据日志分析,HMaster 启动失败的主要原因是 ZooKeeper 连接问题。
具体表现为:
(1)ZooKeeper 连接失败
HMaster 尝试连接 ZooKeeper 集群(hbase01:2181,hbase02:2181,hbase03:2181),但只有 hbase01:2181 能建立 Socket 连接,但立即被关闭。
hbase02 和 hbase03 的 ZooKeeper 服务无法连接(“拒绝连接”)。
(2)ZooKeeper 集群状态异常
日志中反复出现:Opening socket connection to server hbase01/192.168.170.101:2181 Unable to read additional data from server sessionid 0x0, likely server has closed socket 说明即使 hbase01 上的 ZooKeeper 进程存在,但服务未正常响应。
(3)HBase 无法创建 ZNode
HMaster 尝试在 ZooKeeper 上创建 baseZNode(/hbase-fully)时失败,抛出 ConnectionLoss 异常。
2.解决方案
✅步骤 1:检查 ZooKeeper 服务状态
在每台机器上执行:
检查 ZooKeeper 进程
jps | grep QuorumPeerMain
检查 ZooKeeper 服务端口
netstat -tlnp | grep 2181
如果 ZooKeeper 未运行,启动它:
在每台 ZK 节点上执行
zkServer.sh start
✅ 步骤 2:验证 ZooKeeper 集群健康状态
在任意一台机器上执行:
zkCli.sh -server hbase01:2181,hbase02:2181,hbase03:2181
如果连接成功,执行 ls / 查看根节点。如果失败,检查 ZooKeeper 配置(zoo.cfg)和日志。
✅ 步骤 3:检查 ZooKeeper 配置文件
确保每台 ZooKeeper 节点的 zoo.cfg 中包含:
ini
server.1=hbase01:2888:3888
server.2=hbase02:2888:3888
server.3=hbase03:2888:3888
并确保每台机器的 dataDir 下的 myid 文件与上述编号一致。
✅ 步骤 4:检查网络和防火墙
确保三台机器之间的 2181、2888、3888 端口互通:
telnet hbase02 2181
telnet hbase03 2181
✅ 步骤 5:清理 HBase 在 ZooKeeper 中的残留 ZNode(可选)
如果 ZooKeeper 服务恢复但仍无法启动,可尝试清理旧 ZNode(谨慎操作):
zkCli.sh -server hbase01:2181
rmr /hbase-fully
✅ 步骤 6:重启 HBase Master
在 ZooKeeper 集群正常后,重启 HMaster:
hbase-daemon.sh stop master
hbase-daemon.sh start master
📌 预防建议
使用 systemd 或 supervisord 管理 ZooKeeper 和 HBase 服务,确保自动重启。
配置监控告警,及时发现 ZooKeeper 或 HBase 服务异常。
一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一
一.我是在步骤二就发现了问题,我连接到 ZooKeeper 客户端后, ls /hbase 发现没有 HBase 集群的子节点,
这明确表明HBase Master 从未成功启动并在 ZooKeeper 中创建其根节点。

二. 现在需要做的就是找出 HMaster 启动失败的具体原因。这几乎总是能在它的日志文件中找到答案。
定位日志文件根据你之前的启动日志,HMaster 的日志文件位于:(文件的安装目录)
/export/servers/full/hbase-2.4.9/logs/hbase-root-master-hbase01.out
查看日志内容请在 hbase01 服务器上,使用以下命令查看日志的最后部分,这通常包含了最致命的错误信息:
tail -n 200 /export/servers/full/hbase-2.4.9/logs/hbase-root-master-hbase01.out
或者使用 less 命令分页查看整个日志:
less /export/servers/full/hbase-2.4.9/logs/hbase-root-master-hbase01.out
寻找关键错误信息在日志中,请特别关注以下类型的关键字:
ERROR
Exception
FATAL
Caused by:
三.解决方案
我的日志文件
[root@hbase01 ~]# tail -n 200 /export/servers/full/hbase-2.4.9/logs/hbase-root-master-hbase01.out
/export/servers/hadoop-3.2.4/libexec/hadoop-functions.sh:行2401: HADOOP_ORG.APACHE.HADOOP.HBASE.UTIL.GETJAVAPROPERTY_USER:无效的变量名
/export/servers/hadoop-3.2.4/libexec/hadoop-functions.sh:行2366: HADOOP_ORG.APACHE.HADOOP.HBASE.UTIL.GETJAVAPROPERTY_USER:无效的变量名
/export/servers/hadoop-3.2.4/libexec/hadoop-functions.sh:行2461: HADOOP_ORG.APACHE.HADOOP.HBASE.UTIL.GETJAVAPROPERTY_OPTS:无效的变量名
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/export/servers/hadoop-3.2.4/share/hadoop/common/lib/slf4j-reload4j-1.7.35.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/export/servers/full/hbase-2.4.9/lib/client-facing-thirdparty/slf4j-log4j12-1.7.30.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Reload4jLoggerFactory]
[root@hbase01 ~]#
核心问题
日志中反复出现的 "无效的变量名" 错误,就是导致 HMaster 无法启动的根本原因。
/export/servers/hadoop-3.2.4/libexec/hadoop-functions.sh:行2401: HADOOP_ORG.APACHE.HADOOP.HBASE.UTIL.GETJAVAPROPERTY_USER:无效的变量名
这个错误发生在 HBase 启动脚本调用 Hadoop 的 hadoop-functions.sh 脚本时。HBase 传递了一个包含 . (点号) 的变量名,而 Bash 脚本语言不允许变量名中包含 .,导致脚本解析失败。
这就像一个程序在第一步就遇到了语法错误,根本无法继续执行下去。因此,HMaster 进程在初始化阶段就异常退出了,这也解释了为什么在 ZooKeeper 中找不到 /hbase 节点。
解决方案
我们来实施之前讨论过的修复方案。推荐优先尝试方案 A,因为它更简单且是官方推荐的做法。
方案 A:修改 HBase 配置(推荐)
这个方案通过配置 HBase,避免它去调用有问题的 Hadoop 脚本逻辑。
编辑 hbase-env.sh 文件
bash
vi /export/servers/full/hbase-2.4.9/conf/hbase-env.sh
添加以下配置在文件末尾添加这两行,以隔离 HBase 的类路径并指定 Hadoop 配置:
bash
# 禁止 HBase 自动加载 Hadoop 的类路径,这是导致变量冲突的主要原因
export HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP=true
# 手动指定 Hadoop 配置文件的路径,确保 HBase 能找到必要的 Hadoop 配置
export HADOOP_CONF_DIR=/export/servers/hadoop-3.2.4/etc/hadoop
同步到所有节点非常重要:这个修改需要应用到集群中的所有节点(hbase01, hbase02, hbase03)。
bash
scp /export/servers/full/hbase-2.4.9/conf/hbase-env.sh hbase02:/export/servers/full/hbase-2.4.9/conf/
scp /export/servers/full/hbase-2.4.9/conf/hbase-env.sh hbase03:/export/servers/full/hbase-2.4.9/conf/
重启 HBase 集群
bash
# 先停止(如果有进程残留)
stop-hbase.sh
再启动
start-hbase.sh
验证
在 hbase01 上执行 jps,检查 HMaster 进程是否已成功启动并稳定运行。
使用 zkCli.sh 连接 ZooKeeper,执行 ls /hbase,检查 /hbase 节点是否已经存在。
方案 B:修改 Hadoop 脚本(备用方案)
如果方案 A 无效,说明问题可能更复杂,需要修改 Hadoop 的脚本使其能够处理含 . 的变量名。
编辑 hadoop-functions.sh 文件
bash
vi /export/servers/hadoop-3.2.4/libexec/hadoop-functions.sh
修改变量名生成逻辑找到 hadoop_build_custom_subcmd_var 这个函数(可以用 /hadoop_build_custom_subcmd_var 搜索),然后修改它,让它在生成变量名时,把所有的 . 替换成 。
原始函数可能看起来像这样:
bash
function hadoop_build_custom_subcmd_var
{
local program=$1
local cmd=$2
local suffix=$3
echo "HADOOP${program}${cmd}${suffix}"
}
修改后的函数:
bash
function hadoop_build_custom_subcmd_var
{
local program=$1
local cmd=$2
local suffix=$3
# 使用 tr 命令将所有的 '.' 替换为 ''
echo "HADOOP${program}${cmd}${suffix}" | tr '.' '_'
}
同步到所有节点这个修改同样需要同步到所有安装了 Hadoop 的节点。
bash
scp /export/servers/hadoop-3.2.4/libexec/hadoop-functions.sh hbase02:/export/servers/hadoop-3.2.4/libexec/
scp /export/servers/hadoop-3.2.4/libexec/hadoop-functions.sh hbase03:/export/servers/hadoop-3.2.4/libexec/
重启 HBase 集群同上,停止并重新启动 HBase。
总结与下一步
请立即尝试方案 A。这是解决此问题的最直接、最安全的方法。如果执行后 HMaster 进程能够稳定运行,并且在 ZooKeeper 中成功创建了 /hbase 节点,那么问题就解决了。
如果问题依然存在,请务必再次查看 HMaster 的日志,看看错误信息是否发生了变化,然后我们再根据新的日志进行分析。
浙公网安备 33010602011771号