Ubuntu 16.04 下 HBase 伪分布式安装配置与故障排查
2026/9/17 14:45:13 网站建设 项目流程

HBase 这东西,在 Hadoop 生态里经常被放到“学完 HDFS 和 MapReduce 之后再碰”的位置,但真正上手才会发现,它跟 MySQL 那种装完就能用的数据库完全不是一回事。尤其是在 Ubuntu 16.04 这种老系统上,HBase 的下载、安装与配置会牵扯到 Java、Hadoop、ZooKeeper、HDFS 权限、主机名解析、时间同步和端口占用,任何一个环节掉链子,HMaster 都可能启动几秒后直接退出。我这次就把一套能复现的 HBase 伪分布式安装流程完整拆开,从版本选型到配置文件逐项解释,再到启动验证和故障排查。只要你的 Ubuntu 16.04 上已经有一套能正常读写的 Hadoop 伪分布式环境,这篇内容就可以直接照着做。即使你是刚接触大数据的新手,也能看懂每一步为什么这么做,以及哪些地方最容易踩坑。

1. 先别急着解压:HBase 在 Ubuntu 16.04 上的选型与依赖关系

1.1 为什么版本组合比安装步骤更重要

很多人装 HBase 的习惯是先去官网找最新版,然后tar -zxvf解压,改两个配置就启动。这个思路在 MySQL、Redis 上可能行得通,在 HBase 上却很容易翻车。原因不复杂:HBase 不是独立数据库,它要依赖 HDFS 做底层存储,依赖 ZooKeeper 做集群协调,还要依赖 Hadoop 客户端库去访问 HDFS。只要 HBase 和 Hadoop 的版本不匹配,或者 Java 版本不对,就会出现NoClassDefFoundErrorNoSuchMethodErrorClassNotFoundException这类让人头大的错误。

Ubuntu 16.04 默认软件源里的 OpenJDK 是 8,这一点对 HBase 很友好。HBase 1.x、2.x 的主流稳定版本都支持 JDK 8,所以 Java 这一层不用折腾太多。真正要定的是 Hadoop 和 HBase 的搭配。如果你之前跟着教程搭的是 Hadoop 2.7.x 伪分布式,那么 HBase 1.3.x 或 2.0.x 是比较稳的选择;如果你用的是 Hadoop 3.3.x,那 HBase 2.4.x 更合适。我这次以Hadoop 3.3.6 + HBase 2.4.17 + JDK 8为例,这套组合在 Ubuntu 16.04 上跑伪分布式没有问题,配置思路也同样适用于 HBase 1.3.x。

为什么不建议直接上 HBase 3.x?不是它不好,而是老教程、老环境、老依赖太多,很多示例代码和配置文件还是围绕 HBase 1.x/2.x 写的。学习阶段优先求稳,等把 HBase 的 Region、Store、MemStore、WAL、ZooKeeper 协调这些概念跑通之后,再升级也不迟。另一个现实问题是 Ubuntu 16.04 本身已经停止官方支持,很多新版本软件对 glibc、系统库的要求更高,强行上新版可能引入一堆系统级依赖问题。

1.2 HBase 与 HDFS、ZooKeeper 的依赖边界

先用生活化的方式理解:HDFS 像一块巨大的硬盘,负责把数据分散存到多台机器上;ZooKeeper 像一个通讯录加协调员,负责记录 HMaster 是谁、RegionServer 有哪些、集群状态如何;HBase 则是建立在 HDFS 之上的分布式列式数据库,负责把数据组织成表、行、列族和单元格。HBase 自己不直接管理磁盘块,它把数据写成 HFile 放到 HDFS 上,所以 HDFS 必须先健康运行。

伪分布式模式下,HDFS、ZooKeeper、HMaster、HRegionServer 都可以跑在同一台机器上。HBase 自带一个 ZooKeeper,可以通过HBASE_MANAGES_ZK=true让 HBase 启动时顺带把 ZooKeeper 拉起来。这样做的好处是省事,适合学习和测试;坏处是 ZooKeeper 跟 HBase 生命周期绑在一起,排查问题时容易互相干扰。如果你之前已经独立装过 ZooKeeper,也可以把HBASE_MANAGES_ZK设为false,让 HBase 去连接外部 ZooKeeper。两种方式都行,但必须保证端口不冲突,尤其是 2181 端口。

还有一个容易被忽略的点:HBase 访问 HDFS 时,需要知道fs.defaultFS和 HDFS 相关参数。这些参数通常在 Hadoop 的core-site.xmlhdfs-site.xml里。你可以把这两个文件复制到 HBase 的conf目录,也可以设置HADOOP_CONF_DIR让 HBase 去读 Hadoop 配置。我的建议是复制一份到 HBase 的conf下,简单直接,后期排查也直观。

提示:HBase 的hbase.rootdir指向 HDFS 路径,例如hdfs://localhost:9000/hbase;而hbase.zookeeper.property.dataDir指向本地磁盘路径,例如/usr/local/hbase/data/zookeeper。这两个不要搞混,前者是数据最终落盘的位置,后者是 ZooKeeper 的快照和事务日志目录。

2. 安装前的系统检查:把 Ubuntu 16.04 的基础坑先填了

2.1 主机名、hosts、时间同步与用户权限

HBase 对主机名解析非常敏感。伪分布式虽然只用一台机器,但 HBase 内部还是会用主机名去注册 RegionServer,如果主机名解析不到,就会报UnknownHostException。先执行hostname看看当前主机名,比如是hbase-node。然后编辑/etc/hosts,确保有一行把127.0.0.1映射到localhost和当前主机名:

sudo vim /etc/hosts

加入类似内容:

127.0.0.1 localhost 127.0.0.1 hbase-node

如果你用的是云主机或虚拟机,最好不要只写127.0.0.1,而是把内网 IP 和主机名也对应上。比如:

192.168.56.101 hbase-node

这样 HBase 在绑定地址和反向解析时不容易出问题。改完之后用ping hbase-nodehostname -f验证一下,能正常解析再继续。

时间同步也是 HBase 的硬要求。HBase 依赖 ZooKeeper,ZooKeeper 对节点时间偏差很敏感,偏差太大可能导致会话超时、RegionServer 掉线。Ubuntu 16.04 可以用ntpdate手动同步一次:

sudo apt-get install -y ntpdate sudo ntpdate ntp.aliyun.com

如果系统提示the NTP socket is in use,可以先停掉ntp服务,或者直接用timedatectl查看时间状态。学习环境里,只要几台机器时间差在几十秒以内,一般不会立刻出问题,但养成同步习惯没坏处。

用户权限方面,不建议用 root 直接启动 Hadoop 和 HBase。很多教程为了省事用 root 跑,结果 HDFS 目录、本地日志目录、ZooKeeper 数据目录全都变成 root 属主,后面换普通用户启动就各种权限拒绝。我一般会创建一个专用用户,比如bigdata

sudo useradd -m -s /bin/bash bigdata sudo passwd bigdata sudo usermod -aG sudo bigdata

然后把 Hadoop、HBase 安装目录都交给这个用户,后续所有操作都切到bigdata下执行。如果你之前 Hadoop 已经用别的用户装好了,那就继续用同一个用户,不要混用。

2.2 Java 环境与 Hadoop 伪分布式状态确认

HBase 需要 Java,先确认 JDK 8 已经装好:

java -version javac -version echo $JAVA_HOME

如果JAVA_HOME没输出,编辑~/.bashrc

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH

然后source ~/.bashrc。注意JAVA_HOME不要指向 JRE,必须指向 JDK 根目录,否则 HBase 启动时可能找不到tools.jar相关类。

接下来确认 Hadoop 伪分布式是活的。先启动 HDFS:

start-dfs.sh jps

正常应该看到NameNodeDataNodeSecondaryNameNode。再用hdfs dfs -ls /看能不能列出根目录。如果这一步就报Connection refused,先别装 HBase,先把 Hadoop 修好。HBase 启动时会去连hbase.rootdir指定的 HDFS 地址,如果 HDFS 没起来,HMaster 日志里会直接报连接异常。

确认core-site.xml里的fs.defaultFS是什么:

grep -A2 fs.defaultFS $HADOOP_HOME/etc/hadoop/core-site.xml

常见的是hdfs://localhost:9000。记住这个地址,后面配hbase.rootdir要用。如果你的 HDFS 端口是 8020,那就写 8020,不要照抄 9000。Hadoop 3 的 NameNode Web UI 默认端口是 9870,Hadoop 2 是 50070,这个只影响浏览器访问,不影响 HBase 配置。

另外,HBase 需要访问 HDFS 上的/hbase目录。这个目录可以由 HBase 自动创建,但前提是启动 HBase 的用户对 HDFS 根目录有写权限。伪分布式下,如果你用bigdata用户启动 HDFS,那 HBase 也用bigdata启动,一般没问题。如果之前用 root 格式化过 HDFS,建议检查一下:

hdfs dfs -ls / hdfs dfs -mkdir -p /hbase hdfs dfs -chown -R bigdata:bigdata /hbase hdfs dfs -chmod -R 775 /hbase

手动创建并授权,比等 HBase 启动时报Permission denied再回头查要省时间。

3. HBase 下载与目录规划:下载源、解压和软链接

3.1 下载 HBase 安装包:官方归档与镜像站

HBase 的下载方式很简单,但选对版本很关键。官方归档地址是https://archive.apache.org/dist/hbase/,里面保留了历史版本。比如 HBase 2.4.17:

cd /tmp wget https://archive.apache.org/dist/hbase/2.4.17/hbase-2.4.17-bin.tar.gz

如果官方归档下载慢,可以用国内镜像站。比如清华镜像:

wget https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/2.4.17/hbase-2.4.17-bin.tar.gz

注意镜像站通常只保留较新版本,老版本可能已经清理,所以找老版本时还是以官方归档为准。下载完成后一定要校验文件大小,最好再看一眼 SHA512:

sha512sum hbase-2.4.17-bin.tar.gz

对比官网.sha512文件里的值。学习环境里不校验也能跑,但养成校验习惯,能避免压缩包不完整导致解压报错。

选择bin包还是src包?直接选bin包。src是源码包,需要自己编译,对学习安装没有意义。HBase 的bin包里已经包含运行所需 jar,解压就能用。

3.2 解压、目录归属和环境变量

我习惯把 HBase 放在/usr/local/hbase下,并用软链接指向具体版本,方便以后升级:

sudo mkdir -p /usr/local/hbase sudo tar -zxvf /tmp/hbase-2.4.17-bin.tar.gz -C /usr/local/hbase sudo ln -s /usr/local/hbase/hbase-2.4.17 /usr/local/hbase/current sudo chown -R bigdata:bigdata /usr/local/hbase

这样 HBase 的实际目录是/usr/local/hbase/hbase-2.4.17,但环境变量可以用/usr/local/hbase/current。以后换版本只需要改软链接,HBASE_HOME不用动。

接着配置环境变量,编辑~/.bashrc

export HBASE_HOME=/usr/local/hbase/current export PATH=$HBASE_HOME/bin:$PATH export HADOOP_HOME=/usr/local/hadoop export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

HADOOP_HOMEHADOOP_CONF_DIR不是 HBase 必须写在hbase-env.sh里的,但放在系统环境变量里能减少很多类路径问题。改完执行:

source ~/.bashrc which hbase

如果输出/usr/local/hbase/current/bin/hbase,说明环境变量生效了。

注意:不要把所有东西都塞在/root下然后换普通用户操作。目录属主和权限在 HBase 里非常关键,本地日志目录、PID 目录、ZooKeeper 数据目录都要让启动用户有写权限。否则你会看到 HMaster 启动后日志里写Permission denied,然后进程悄悄退出。

4. 配置文件逐项拆解:hbase-site.xml、hbase-env.sh、regionservers

4.1 hbase-site.xml:rootdir、分布式模式与 ZooKeeper 参数

HBase 的核心配置在$HBASE_HOME/conf/hbase-site.xml。刚解压时这个文件只有一个空骨架,需要自己加 property。下面是我在伪分布式下用的配置:

<configuration> <property> <name>hbase.rootdir</name> <value>hdfs://localhost:9000/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.tmp.dir</name> <value>/usr/local/hbase/data/tmp</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>localhost</value> </property> <property> <name>hbase.zookeeper.property.clientPort</name> <value>2181</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/usr/local/hbase/data/zookeeper</value> </property> <property> <name>hbase.master.info.port</name> <value>16010</value> </property> <property> <name>hbase.regionserver.info.port</name> <value>16030</value> </property> <property> <name>hbase.unsafe.stream.capability.enforce</name> <value>false</value> </property> </configuration>

逐项解释一下。hbase.rootdir必须写 HDFS 地址,不是本地路径。如果写成/hbase,HBase 会把它当成本地文件系统,伪分布式测试可能也能跑,但数据不会进 HDFS,失去学习 HBase on HDFS 的意义。hbase.cluster.distributed设为true表示分布式模式,伪分布式也建议开,否则 HBase 会以本地模式启动,不启动 HMaster 和 HRegionServer。

hbase.zookeeper.quorum是 ZooKeeper 地址,伪分布式写localhost。如果你有独立 ZooKeeper 集群,就写多个主机名,逗号分隔。hbase.zookeeper.property.dataDir是 ZooKeeper 数据目录,HBase 自带 ZooKeeper 时会用它。这个目录不要放在/tmp下,否则系统重启后数据可能丢失,HBase 元数据异常。

hbase.unsafe.stream.capability.enforce是 HBase 2.x 跑在 Hadoop 3 上常见的兼容参数。某些版本里如果不设成false,会报 HDFS 流能力相关的错误。它不是所有环境都必须,但如果启动时报UnsupportedOperationException或 stream capability 相关异常,可以先加上这个配置。

4.2 hbase-env.sh:JAVA_HOME、日志目录与 HBASE_MANAGES_ZK

hbase-env.sh控制 HBase 运行环境。打开文件:

vim $HBASE_HOME/conf/hbase-env.sh

找到对应行并修改:

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export HBASE_MANAGES_ZK=true export HBASE_LOG_DIR=/usr/local/hbase/logs export HBASE_PID_DIR=/usr/local/hbase/pids export HBASE_HEAPSIZE=1024 export HADOOP_HOME=/usr/local/hadoop export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop

HBASE_MANAGES_ZK=true表示让 HBase 自己管理 ZooKeeper。启动start-hbase.sh时,HBase 会先拉起一个HQuorumPeer进程,也就是它自带的 ZooKeeper。如果你已经独立安装了 ZooKeeper,并且希望用自己的,就把它改成false,同时确保hbase.zookeeper.quorum指向你的 ZooKeeper 地址。两种方式不要同时占 2181 端口,否则会报Address already in use

HBASE_HEAPSIZE=1024表示给 HBase 进程 1GB 堆内存。伪分布式学习环境如果虚拟机总共只有 2GB 内存,可以降到 512,但启动会更慢,RegionServer 也容易因为内存不足被系统杀掉。建议 Ubuntu 16.04 虚拟机至少给 4GB 内存,HBase 跑起来会舒服很多。

HBASE_LOG_DIRHBASE_PID_DIR最好设到安装目录下,并且提前创建:

mkdir -p /usr/local/hbase/logs /usr/local/hbase/pids /usr/local/hbase/data chown -R bigdata:bigdata /usr/local/hbase

日志目录非常重要,HBase 启动失败时,控制台往往只输出几行模糊信息,真正原因都在logs目录里。

4.3 regionservers 与 Hadoop 配置文件同步

regionservers文件告诉 HBase 哪些节点要启动 RegionServer。伪分布式下写:

localhost

如果写主机名,比如hbase-node,那就要确保/etc/hosts能解析。写完不要留空行和多余空格,否则启动时可能尝试连接空主机名。

接着把 Hadoop 配置文件复制到 HBase 的conf目录:

cp $HADOOP_HOME/etc/hadoop/core-site.xml $HBASE_HOME/conf/ cp $HADOOP_HOME/etc/hadoop/hdfs-site.xml $HBASE_HOME/conf/

这一步很多人会漏掉。HBase 启动时要通过 Hadoop 客户端访问 HDFS,如果conf下没有core-site.xml,它可能不知道fs.defaultFS是什么,于是连到默认的file:///,导致hbase.rootdir配置看起来对但实际行为不对。复制之后,HBase 读取的就是同一套 HDFS 参数,能避免很多“配置明明一样却连不上”的问题。

提示:不要直接把 Hadoop 的整个etc/hadoop目录软链接到 HBaseconf,因为两边都有log4j.properties之类的同名文件,容易互相覆盖。只复制core-site.xmlhdfs-site.xml就够了,需要 YARN 相关配置时再单独处理。

5. 启动、验证与 HBase Shell 基础操作

5.1 启动顺序与启停命令

HBase 的启动顺序很明确:先 HDFS,再 HBase。如果使用 HBase 自带 ZooKeeper,ZooKeeper 会由start-hbase.sh自动带起来。标准流程:

# 1. 启动 HDFS start-dfs.sh # 2. 确认 HDFS 正常 jps hdfs dfs -ls / # 3. 启动 HBase start-hbase.sh

启动完成后用jps查看进程。正常应该看到:

  • NameNode
  • DataNode
  • SecondaryNameNode
  • HMaster
  • HRegionServer
  • HQuorumPeer

其中HQuorumPeer是 HBase 自带 ZooKeeper 的进程名。如果没有看到HMaster,先别急着重装,直接去看$HBASE_LOG_DIR下的 master 日志。停止 HBase 用:

stop-hbase.sh

停止顺序和启动相反,先停 HBase,再停 HDFS。不要直接kill -9HMaster 和 RegionServer,虽然测试环境里偶尔也能恢复,但容易在 HDFS 上留下未清理的 WAL 和临时文件,下次启动可能出现 Region 分配异常。

5.2 进程、端口与 Web UI 验证

除了jps,还要检查端口。HBase 常用端口如下:

组件端口用途
HMaster RPC16000HMaster 服务端口
HMaster Web UI16010浏览器查看 Master 状态
HRegionServer RPC16020RegionServer 服务端口
HRegionServer Web UI16030浏览器查看 RegionServer 状态
ZooKeeper2181客户端连接端口
HDFS NameNode RPC9000 或 8020HBase 访问 HDFS
HDFS NameNode UI9870 或 50070查看 HDFS 状态

netstat检查:

sudo netstat -tunlp | grep -E '16000|16010|16020|16030|2181'

如果 16010 没有监听,说明 HMaster 没起来。如果 2181 被其他进程占用,HBase 自带 ZooKeeper 会启动失败。浏览器访问http://你的主机名:16010,能看到 HBase Master 页面,里面会显示 RegionServer 数量、表列表、集群状态。RegionServer 页面是http://你的主机名:16030。如果页面打不开,先确认不是防火墙拦截。Ubuntu 16.04 默认 ufw 可能是关闭的,但如果开了,需要放行:

sudo ufw status sudo ufw allow 16010/tcp sudo ufw allow 16030/tcp sudo ufw allow 2181/tcp

学习环境里也可以临时关闭 ufw,但生产环境不要这么做,按需放行端口更稳妥。

5.3 hbase shell 建表、写入、查询、删除

进程和端口正常后,进入 HBase Shell:

hbase shell

先看集群状态:

status list

创建一个学生表,包含infoscore两个列族:

create 'student', 'info', 'score'

写入数据:

put 'student', '1001', 'info:name', 'zhangsan' put 'student', '1001', 'info:age', '20' put 'student', '1001', 'score:math', '90' put 'student', '1002', 'info:name', 'lisi' put 'student', '1002', 'score:math', '85'

查询单行:

get 'student', '1001'

扫描全表:

scan 'student'

查看表结构:

describe 'student'

删除表之前必须先禁用:

disable 'student' drop 'student'

退出 Shell:

exit

这里有几个新手容易犯的错。第一,HBase Shell 里字符串要用单引号,表名、行键、列族、列限定符都区分大小写。第二,create时列族一旦创建,后续修改列族属性比较麻烦,所以学习阶段可以多建几个列族练手,但真实业务里列族数量不宜过多。第三,scan全表在数据量大时会很慢,学习时数据少无所谓,生产环境要配合STARTROWSTOPROWLIMIT使用。

6. 常见故障排查:HMaster 起不来、RegionServer 掉线、Shell 卡死

6.1 启动阶段报错与日志定位

HBase 启动失败时,第一反应不应该是重装,而是看日志。日志目录由HBASE_LOG_DIR指定,默认在$HBASE_HOME/logs。主要看两个文件:

ls $HBASE_LOG_DIR tail -n 200 $HBASE_LOG_DIR/hbase-*-master-*.log tail -n 200 $HBASE_LOG_DIR/hbase-*-regionserver-*.log

如果HMaster进程没起来,重点看 master 日志。常见原因有:

  • hbase.rootdir指向的 HDFS 路径无权访问,日志里会出现Permission denied
  • HDFS 没启动,日志里会出现Connection refusedCall From ... to ... failed
  • ZooKeeper 端口 2181 被占用,日志里会出现Address already in use
  • hbase-site.xml里属性名拼错,HBase 启动时不会严格校验,但运行时会用默认值,导致行为异常。
  • Java 版本不对,日志里可能出现UnsupportedClassVersionError

如果HMaster起来几秒后退出,常见原因是 HDFS 上的/hbase目录权限不对,或者 ZooKeeper 数据目录不可写。先确认本地目录权限:

ls -ld /usr/local/hbase/data /usr/local/hbase/logs /usr/local/hbase/pids

再确认 HDFS 目录权限:

hdfs dfs -ls -R /hbase | head hdfs dfs -chown -R bigdata:bigdata /hbase hdfs dfs -chmod -R 775 /hbase

6.2 端口、时间、权限和 NoClassDefFoundError 排查

java.lang.NoClassDefFoundError: org/apache/hadoop/crypto这个错误在大数据环境里很典型,通常不是 HBase 少了一个包那么简单,而是 HBase 和 Hadoop 版本不匹配,或者 HBase 找不到 Hadoop 客户端库。排查顺序如下:

  1. 确认HADOOP_HOMEHADOOP_CONF_DIR是否正确设置。
  2. 确认 HBase 的conf下已经复制了core-site.xmlhdfs-site.xml
  3. 确认 HBase 版本支持当前 Hadoop 版本。HBase 2.4.x 搭配 Hadoop 3.3.x 通常没问题;HBase 1.3.x 搭配 Hadoop 3.x 就容易出兼容问题。
  4. 如果使用了 HBase 2.x + Hadoop 3.x,检查hbase.unsafe.stream.capability.enforce=false是否配置。
  5. 不要随便把 Hadoop 的所有 jar 复制到 HBase 的lib下。这样做可能解决一个类找不到的问题,但会引入 Guava、Jackson 等多个版本冲突,出现NoSuchMethodError。优先用版本匹配来解决。

KeeperErrorCode = ConnectionLoss for /hbase也很常见,意思是 HBase 连不上 ZooKeeper。检查项包括:

echo ruok | nc localhost 2181 sudo netstat -tunlp | grep 2181 cat /etc/hosts date

如果 2181 没监听,说明 ZooKeeper 没起来。看 HBase 日志里HQuorumPeer相关输出。如果 2181 被独立 ZooKeeper 占用,而 HBase 又配置了HBASE_MANAGES_ZK=true,那就冲突了。解决方式是二选一:要么停掉独立 ZooKeeper,让 HBase 自己管;要么把HBASE_MANAGES_ZK改为false,并让hbase.zookeeper.quorum指向独立 ZooKeeper。

RegionServer 掉线通常和内存、磁盘、时间同步有关。日志里如果出现RegionServer is exitingOutOfMemoryErrorDiskErrorException,就要检查虚拟机内存是否不足、HDFS 磁盘是否写满、HBASE_HEAPSIZE是否设得太大导致系统 OOM。伪分布式下,如果虚拟机只有 2GB 内存,同时跑 NameNode、DataNode、HMaster、HRegionServer、ZooKeeper,很容易内存不够。给到 4GB 以上会稳很多。

6.3 常用排查命令速查表

现象优先检查常用命令
HMaster 没进程HDFS 是否启动、日志报错jpstail -f $HBASE_LOG_DIR/hbase-*-master-*.log
RegionServer 掉线内存、时间同步、HDFS 磁盘free -hdatehdfs dfsadmin -report
Shell 卡死ZooKeeper 连接、DNS 解析`echo ruok
16010 打不开HMaster 是否存活、防火墙`netstat -tunlp
表创建失败HDFS 权限、Region 分配hdfs dfs -ls /hbasehbase hbck
类找不到Hadoop/HBase 版本、类路径hbase classpath、检查HADOOP_HOME

hbase hbck是一个很有用的工具,可以检查 HBase 集群元数据和 Region 状态是否一致。学习环境里如果表状态异常,可以执行:

hbase hbck

如果输出Status: OK,说明基本正常。如果有INCONSISTENCY,再根据提示处理。不要一上来就hbck -fix,先看清问题,测试环境可以修,生产环境要谨慎。

7. 踩坑后的经验沉淀:几个能省半天时间的做法

7.1 配置改动后的重启纪律

HBase 的配置文件改完之后,必须重启 HBase 才能生效。很多人的习惯是改完hbase-site.xml直接进hbase shell测试,发现没变化,以为是配置写错了。实际上 HMaster 和 RegionServer 还在用旧配置跑。正确做法:

stop-hbase.sh # 确认进程都退出 jps # 如果需要,也重启 HDFS stop-dfs.sh start-dfs.sh start-hbase.sh

重启前养成备份配置的习惯:

cp $HBASE_HOME/conf/hbase-site.xml $HBASE_HOME/conf/hbase-site.xml.bak

HBase 不像某些服务支持热加载大量参数,伪分布式学习阶段,改配置就老实重启,比反复猜要快。

另一个经验是,如果你在 HDFS 上删除了/hbase目录想重新初始化,一定要先停 HBase,再删目录,再启动。不要在 HBase 运行时删除/hbase,否则 RegionServer 会不断报错,甚至把 ZooKeeper 里的元数据搞乱。测试环境可以这样重置:

stop-hbase.sh hdfs dfs -rm -r /hbase start-hbase.sh

生产环境不要这么干,数据会丢。学习环境里重置是家常便饭,但要知道自己在做什么。

7.2 从伪分布式扩展到集群时先改什么

伪分布式跑通之后,如果想把 HBase 扩展到三台机器的完全分布式,不要急着一台一台乱改。优先改这几个地方:

  • hbase.rootdirhdfs://localhost:9000/hbase改成hdfs://namenode:9000/hbase,指向真正的 HDFS 集群。
  • hbase.zookeeper.quorum改成 ZooKeeper 集群地址,例如zk1,zk2,zk3
  • regionservers里写上所有 RegionServer 主机名,每行一个。
  • HBASE_MANAGES_ZK改为false,使用独立 ZooKeeper 集群,避免 HBase 生命周期和 ZooKeeper 绑死。
  • 所有节点的/etc/hosts、时间同步、JDK、HBase 目录、配置文件保持一致。
  • core-site.xmlhdfs-site.xml同步到所有 HBase 节点的conf下。

扩展时最容易忽略的是时间同步和主机名解析。伪分布式只有一台机器,localhost永远能解析,时间也只有一份。到了集群环境,任何一台机器时间偏差过大,ZooKeeper 会话就可能超时,RegionServer 被踢出集群。另一个坑是 HDFS 权限,HBase 在集群里通常用专用用户启动,要确保这个用户在 HDFS 上有/hbase目录的读写权限。

最后再分享一个小技巧:如果你不确定 HBase 实际加载了哪些配置,可以在启动后查看日志开头,HBase 会打印出hbase.rootdirhbase.zookeeper.quorumhbase.cluster.distributed等关键参数的最终值。别只盯着hbase-site.xml看,日志里打印出来的才是运行时真正生效的配置。踩过几次“配置文件明明改了但没生效”的坑之后,我现在每次启动 HBase 都会先扫一眼日志里的配置摘要,这个习惯能省下大量来回排查的时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询