前言
本文记录了在 CentOS 9 环境下,基于已有的 Hadoop 和 Zookeeper 集群,搭建 HBase 2.4.9 高可用(HA)分布式集群的完整过程。整个部署过程在三台节点上进行,包含环境准备、配置修改、分发、启动和验证等环节。文中也整理了部署中实际踩过的坑和一些配置细节,供参考。
一、环境说明
| 项目 | 版本 / 配置 |
|---|---|
| 操作系统 | CentOS 9 |
| JDK | JDK 1.8.0_241 |
| Hadoop | Hadoop 3.x(已部署并运行) |
| Zookeeper | Zookeeper 3.7.0(已部署并运行) |
| HBase | HBase 2.4.9 |
| 节点规划 | hadoop1(主 Master)、hadoop2(备用 Master + RegionServer)、hadoop3(RegionServer) |
节点 IP 规划(/etc/hosts):
192.168.121.160 hadoop1
192.168.121.161 hadoop2
192.168.121.162 hadoop3
前置条件
在开始安装 HBase 之前,必须确保以下组件已经部署并可正常使用:
- JDK 8:HBase 2.4.x 对 JDK 8 的依赖非常强,使用更高版本可能出现兼容性问题。
- Hadoop(HDFS):HBase 的数据存储在 HDFS 上,HDFS 必须处于正常运行状态。
- Zookeeper:HBase 使用 Zookeeper 进行集群协调,所有节点的 Zookeeper 实例都需要正常启动。
二、下载 HBase 安装包
在 hadoop1 节点上执行以下命令下载安装包到指定目录:
bash
# 创建目录结构(如果尚未创建)
mkdir -p /export/software
mkdir -p /export/servers
# 进入软件下载目录
cd /export/software
# 使用 wget 下载 HBase 2.4.9(Apache 归档站)
# 如果提示 -bash: wget: command not found,先运行: dnf install wget -y
wget https://archive.apache.org/dist/hbase/2.4.9/hbase-2.4.9-bin.tar.gz
# 国内镜像源提速(华为云镜像)
wget https://mirrors.huaweicloud.com/apache/hbase/2.4.9/hbase-2.4.9-bin.tar.gz
说明: 以上两个下载地址任选其一即可。国内环境推荐使用华为云镜像,速度明显更快。
三、解压安装
将下载好的安装包解压到 /export/servers 目录:
bash
tar -zxvf hbase-2.4.9-bin.tar.gz -C /export/servers/
解压后的安装路径为 /export/servers/hbase-2.4.9。
四、配置环境变量
编辑 /etc/profile,将 HBase 的可执行文件路径加入系统 PATH:
bash
vi /etc/profile
在文件末尾添加以下内容:
bash
export HBASE_HOME=/export/servers/hbase-2.4.9
export PATH=$PATH:$HBASE_HOME/bin
使配置立即生效:
bash
source /etc/profile
注意: 同时请确保 Hadoop 的环境变量也已正确配置。如果执行
hdfs命令提示"未找到命令",说明 Hadoop 的bin和sbin路径没有加入 PATH。需要在/etc/profile中补充:
bashexport HADOOP_HOME=/export/servers/hadoop-3.1.3 # 替换为实际路径 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin保存后同样执行
source /etc/profile使其生效。这一步容易遗漏,但如果hdfs命令不通,HBase 将无法连接到 HDFS 存储数据,后续启动会直接报错。
五、修改 HBase 配置文件
进入 HBase 的配置目录:
bash
cd /export/servers/hbase-2.4.9/conf
5.1 修改 hbase-env.sh
该文件用于指定 Java 环境以及 Zookeeper 管理方式。
bash
vi hbase-env.sh
在文件底部添加以下内容:
bash
# 设为 true,解决 HBase 和 Hadoop 的 jar 包冲突
export HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP="true"
# 指定 JAVA_HOME 路径(通过 echo $JAVA_HOME 确认实际路径)
export JAVA_HOME=/export/servers/jdk1.8.0_241
# 设为 false,表示使用外部独立部署的 Zookeeper 集群
export HBASE_MANAGES_ZK=false
说明:
JAVA_HOME一定要填写本机实际的 JDK 安装路径,可以通过echo $JAVA_HOME命令确认。
5.2 修改 hbase-site.xml
这是 HBase 的核心参数配置文件。
bash
vi hbase-site.xml
关于默认配置的处理: HBase 安装包自带的 hbase-site.xml 中,<configuration> 标签内包含一段单机模式的默认配置(hbase.cluster.distributed=false、hbase.tmp.dir=./tmp、hbase.unsafe.stream.capability.enforce=false),这些参数是给开发者单机测试用的。在部署分布式集群时,需要把这些默认配置删除或者用 XML 注释包裹起来,然后替换为集群配置,否则会产生冲突。
XML 的多行注释语法为 <!-- ... -->,可以把不需要的默认配置段整体包裹在注释中。也可以在 vi 中直接删除:将光标移到第一个 <property> 行,输入 dG 即可删除到文件末尾,再手动补上 </configuration> 标签。
将 <configuration> 标签内的内容替换为:
xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop1:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
</configuration>
关于端口号的确认:
hbase.rootdir中的端口9000必须与 Hadoopcore-site.xml中fs.defaultFS的端口一致。Hadoop 3.x 有些配置默认使用8020,有些使用9000,具体取决于安装时的设定。可以通过以下命令确认:
bashhdfs getconf -confKey fs.defaultFS如果输出为
hdfs://hadoop1:8020,需要将hbase-site.xml中的端口改为8020。
关于/etc/hosts:hbase-site.xml中使用了主机名(hadoop1、hadoop2、hadoop3),因此集群所有节点的/etc/hosts文件中必须正确配置了主机名到 IP 的映射关系。
5.3 修改 regionservers
该文件定义了集群的 RegionServer 节点。
bash
vi regionservers
将内容修改为:
hadoop2
hadoop3
注意: 需要删掉文件中默认的
localhost。每个主机名独占一行,行末不能有多余的空格或空行。
5.4 创建 backup-masters
为了实现高可用,需要配置一个备用 Master 节点。
bash
vi backup-masters
添加内容:
hadoop2
六、分发前配置检查
在将安装包分发到其他节点之前,强烈建议在 hadoop1 上做一次全面的配置检查,避免分发后在多台机器上重复修改错误。
6.1 检查 Java 环境
bash
echo $JAVA_HOME
预期输出:/export/servers/jdk1.8.0_241
6.2 检查 HDFS 地址和端口
bash
hdfs getconf -confKey fs.defaultFS
预期输出:hdfs://hadoop1:9000(必须与 hbase-site.xml 中 hbase.rootdir 的前缀一致)
6.3 检查主机名解析
bash
cat /etc/hosts
确认 hadoop1、hadoop2、hadoop3 对应的 IP 地址配置正确。
6.4 检查服务进程
bash
jps
至少应看到 NameNode、ResourceManager(hadoop1 作为管理节点时)。在所有节点上运行,DataNode 必须在 hadoop2、hadoop3 上正常启动。
6.5 检查配置文件有效内容
可以使用以下命令快速检查各配置文件的有效内容(过滤注释行):
bash
cat /export/servers/hbase-2.4.9/conf/hbase-env.sh | grep -v "^#"
cat /export/servers/hbase-2.4.9/conf/hbase-site.xml
cat /export/servers/hbase-2.4.9/conf/regionservers
cat /export/servers/hbase-2.4.9/conf/backup-masters
常见配置错误提醒
- 空格问题:
regionservers和backup-masters中主机名后面不能有空格或多余空行。 - 端口不一致:
hbase.rootdir的端口必须与 Hadoopfs.defaultFS端口一致,这是最容易出问题的地方。 hdfs命令不可用: 如果 Hadoop 的bin路径没加入 PATH,hdfs命令不通,HBase 启动会直接失败。
七、分发安装包到其他节点
确认配置无误后,将 hadoop1 上配置好的 HBase 分发到 hadoop2 和 hadoop3。需要提前配置好 SSH 免密登录。
bash
# 分发到 hadoop2
scp -r /export/servers/hbase-2.4.9 root@hadoop2:/export/servers/
# 分发到 hadoop3
scp -r /export/servers/hbase-2.4.9 root@hadoop3:/export/servers/
分发后必做: 在 hadoop2 和 hadoop3 上也需要配置 HBase 的环境变量。分别编辑各节点的
/etc/profile,添加HBASE_HOME和PATH配置(与第四节相同),并执行source /etc/profile使其生效。
八、启动 HBase 集群
启动顺序很重要,必须严格遵守以下顺序:
- 启动 Zookeeper(在所有节点上执行):
bash
zkServer.sh start
注意: Zookeeper 需要在每个节点上单独启动(hadoop1、hadoop2、hadoop3 都要执行)。如果只在一个节点上启动就直接启动 HBase,集群协调会出现问题。
-
启动 Hadoop (在 NameNode 所在节点执行
start-all.sh或分别启动 HDFS 和 YARN)。 -
启动 HBase(只需在主节点 hadoop1 上执行):
bash
start-hbase.sh
正常启动后终端会输出类似如下信息:
running master, logging to /export/servers/hbase-2.4.9/logs/hbase-root-master-hadoop1.out
hadoop2: running regionserver, logging to /export/servers/hbase-2.4.9/bin/../logs/hbase-root-regionserver-hadoop2.out
hadoop3: running regionserver, logging to /export/servers/hbase-2.4.9/bin/../logs/hbase-root-regionserver-hadoop3.out
hadoop2: running master, logging to /export/servers/hbase-2.4.9/bin/../logs/hbase-root-master-hadoop2.out
可以看到 hadoop1 启动了 HMaster,hadoop2 启动了 RegionServer 和备用 Master,hadoop3 启动了 RegionServer,符合预期的节点规划。
九、安装结果验证
9.1 命令行验证(jps)
在各节点分别执行 jps,检查进程状态:
hadoop1(主 Master):
12836 NameNode
13863 HMaster
13692 QuorumPeerMain
13246 ResourceManager
hadoop2(备用 Master + RegionServer):
应看到 HMaster、HRegionServer、QuorumPeerMain。
hadoop3(RegionServer):
应看到 HRegionServer、QuorumPeerMain。
补充说明: 如果
jps输出中没有看到DataNode,需要确认该节点的角色规划。如果 hadoop1 只做管理节点,不跑 DataNode 是正常的;但 hadoop2 和 hadoop3 上 DataNode 必须处于启动状态,否则 HBase 虽能启动 Master,但无法正常读写数据。
9.2 Web UI 验证
通过浏览器访问 HBase 的 Web 管理界面:
- 主 Master 界面:
http://192.168.121.160:16010 - 备用 Master 界面:
http://192.168.121.161:16010
页面上应能看到:
- Region Servers 列表中显示 hadoop2 和 hadoop3。
- Backup Masters 列表中显示 hadoop2。
防火墙提示: CentOS 9 默认启用了防火墙。如果浏览器无法访问 16010 端口,可以临时关闭防火墙进行测试:
bashsystemctl stop firewalld
9.3 HBase Shell 验证
进入 HBase 命令行交互终端:
bash
hbase shell
执行以下命令确认集群状态:
status
预期输出应显示 2 个 RegionServer。
list
当前应为空表列表(刚安装完毕)。
输入 exit 退出 Shell。
十、常见问题与避坑说明
10.1 hdfs 命令未找到
现象: 执行 hdfs getconf -confKey fs.defaultFS 时提示 -bash: hdfs:未找到命令。
原因: Hadoop 的 bin 和 sbin 路径没有添加到 /etc/profile 中的 PATH 变量。
解决: 在 /etc/profile 中添加 Hadoop 的环境变量并 source 生效,具体见第四节的注意事项。
10.2 hbase-site.xml 默认配置冲突
现象: hbase-site.xml 中同时存在默认的 hbase.cluster.distributed=false 和手动添加的 hbase.cluster.distributed=true,导致配置冲突或行为不确定。
解决: 将默认的三个 <property> 配置块删除或用 XML 注释 <!-- ... --> 包裹起来,只保留集群所需的配置项。
10.3 HDFS 端口号不一致
现象: HBase 启动后无法连接 HDFS,日志报连接超时或拒绝。
原因: hbase-site.xml 中 hbase.rootdir 的端口(如 9000)与 Hadoop core-site.xml 中 fs.defaultFS 的实际端口(如 8020)不一致。
解决: 通过 hdfs getconf -confKey fs.defaultFS 确认实际端口,保持两边一致。
10.4 Zookeeper 未全部启动
现象: HBase 启动后 RegionServer 不断重启或无法注册。
原因: 只在部分节点启动了 Zookeeper,集群无法形成多数派。
解决: 确保 hbase-site.xml 中 hbase.zookeeper.quorum 配置的所有节点都已经执行了 zkServer.sh start。
10.5 regionservers 或 backup-masters 格式问题
现象: 分发后启动时报节点找不到或连接失败。
原因: 文件中主机名后有多余的空格、Tab 或空行。
解决: 确保每行只有纯粹的主机名,无任何多余字符。
十一、日志优化建议
HBase 默认的日志级别为 INFO,运行时会产生大量日志输出,排查问题时反而不容易定位关键信息。可以将日志级别调整为 ERROR,只记录错误信息。
操作方法:
编辑 /export/servers/hbase-2.4.9/conf/log4j.properties,找到以下行:
log4j.rootLogger=INFO,console
修改为:
log4j.rootLogger=ERROR,console
建议: 在集群运行稳定后再做此调整。部署调试阶段建议保持
INFO级别,方便排查问题。
结语
完成以上步骤后,一个三节点的 HBase HA 集群就部署完成了。整个过程中比较容易出问题的环节集中在环境变量配置(特别是 Hadoop 的 PATH)、hbase-site.xml 的默认配置清理、以及 HDFS 端口号的确认上。建议在分发之前一定要做一轮完整的配置预检,避免在多台机器上重复修改。