
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 版本不对就会出现NoClassDefFoundError、NoSuchMethodError、ClassNotFoundException这类让人头大的错误。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_ZKtrue让 HBase 启动时顺带把 ZooKeeper 拉起来。这样做的好处是省事适合学习和测试坏处是 ZooKeeper 跟 HBase 生命周期绑在一起排查问题时容易互相干扰。如果你之前已经独立装过 ZooKeeper也可以把HBASE_MANAGES_ZK设为false让 HBase 去连接外部 ZooKeeper。两种方式都行但必须保证端口不冲突尤其是 2181 端口。还有一个容易被忽略的点HBase 访问 HDFS 时需要知道fs.defaultFS和 HDFS 相关参数。这些参数通常在 Hadoop 的core-site.xml和hdfs-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-node和hostname -f验证一下能正常解析再继续。时间同步也是 HBase 的硬要求。HBase 依赖 ZooKeeperZooKeeper 对节点时间偏差很敏感偏差太大可能导致会话超时、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 属主后面换普通用户启动就各种权限拒绝。我一般会创建一个专用用户比如bigdatasudo 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没输出编辑~/.bashrcexport 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 伪分布式是活的。先启动 HDFSstart-dfs.sh jps正常应该看到NameNode、DataNode、SecondaryNameNode。再用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 默认端口是 9870Hadoop 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.17cd /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注意镜像站通常只保留较新版本老版本可能已经清理所以找老版本时还是以官方归档为准。下载完成后一定要校验文件大小最好再看一眼 SHA512sha512sum 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不用动。接着配置环境变量编辑~/.bashrcexport 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/hadoopHADOOP_HOME和HADOOP_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、regionservers4.1 hbase-site.xmlrootdir、分布式模式与 ZooKeeper 参数HBase 的核心配置在$HBASE_HOME/conf/hbase-site.xml。刚解压时这个文件只有一个空骨架需要自己加 property。下面是我在伪分布式下用的配置configuration property namehbase.rootdir/name valuehdfs://localhost:9000/hbase/value /property property namehbase.cluster.distributed/name valuetrue/value /property property namehbase.tmp.dir/name value/usr/local/hbase/data/tmp/value /property property namehbase.zookeeper.quorum/name valuelocalhost/value /property property namehbase.zookeeper.property.clientPort/name value2181/value /property property namehbase.zookeeper.property.dataDir/name value/usr/local/hbase/data/zookeeper/value /property property namehbase.master.info.port/name value16010/value /property property namehbase.regionserver.info.port/name value16030/value /property property namehbase.unsafe.stream.capability.enforce/name valuefalse/value /property /configuration逐项解释一下。hbase.rootdir必须写 HDFS 地址不是本地路径。如果写成/hbaseHBase 会把它当成本地文件系统伪分布式测试可能也能跑但数据不会进 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.shJAVA_HOME、日志目录与 HBASE_MANAGES_ZKhbase-env.sh控制 HBase 运行环境。打开文件vim $HBASE_HOME/conf/hbase-env.sh找到对应行并修改export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 export HBASE_MANAGES_ZKtrue export HBASE_LOG_DIR/usr/local/hbase/logs export HBASE_PID_DIR/usr/local/hbase/pids export HBASE_HEAPSIZE1024 export HADOOP_HOME/usr/local/hadoop export HADOOP_CONF_DIR/usr/local/hadoop/etc/hadoopHBASE_MANAGES_ZKtrue表示让 HBase 自己管理 ZooKeeper。启动start-hbase.sh时HBase 会先拉起一个HQuorumPeer进程也就是它自带的 ZooKeeper。如果你已经独立安装了 ZooKeeper并且希望用自己的就把它改成false同时确保hbase.zookeeper.quorum指向你的 ZooKeeper 地址。两种方式不要同时占 2181 端口否则会报Address already in use。HBASE_HEAPSIZE1024表示给 HBase 进程 1GB 堆内存。伪分布式学习环境如果虚拟机总共只有 2GB 内存可以降到 512但启动会更慢RegionServer 也容易因为内存不足被系统杀掉。建议 Ubuntu 16.04 虚拟机至少给 4GB 内存HBase 跑起来会舒服很多。HBASE_LOG_DIR和HBASE_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.xml和hdfs-site.xml就够了需要 YARN 相关配置时再单独处理。5. 启动、验证与 HBase Shell 基础操作5.1 启动顺序与启停命令HBase 的启动顺序很明确先 HDFS再 HBase。如果使用 HBase 自带 ZooKeeperZooKeeper 会由start-hbase.sh自动带起来。标准流程# 1. 启动 HDFS start-dfs.sh # 2. 确认 HDFS 正常 jps hdfs dfs -ls / # 3. 启动 HBase start-hbase.sh启动完成后用jps查看进程。正常应该看到NameNodeDataNodeSecondaryNameNodeHMasterHRegionServerHQuorumPeer其中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 访问 HDFSHDFS 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 Shellhbase shell先看集群状态status list创建一个学生表包含info和score两个列族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退出 Shellexit这里有几个新手容易犯的错。第一HBase Shell 里字符串要用单引号表名、行键、列族、列限定符都区分大小写。第二create时列族一旦创建后续修改列族属性比较麻烦所以学习阶段可以多建几个列族练手但真实业务里列族数量不宜过多。第三scan全表在数据量大时会很慢学习时数据少无所谓生产环境要配合STARTROW、STOPROW、LIMIT使用。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 refused或Call 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 /hbase6.2 端口、时间、权限和 NoClassDefFoundError 排查java.lang.NoClassDefFoundError: org/apache/hadoop/crypto这个错误在大数据环境里很典型通常不是 HBase 少了一个包那么简单而是 HBase 和 Hadoop 版本不匹配或者 HBase 找不到 Hadoop 客户端库。排查顺序如下确认HADOOP_HOME和HADOOP_CONF_DIR是否正确设置。确认 HBase 的conf下已经复制了core-site.xml和hdfs-site.xml。确认 HBase 版本支持当前 Hadoop 版本。HBase 2.4.x 搭配 Hadoop 3.3.x 通常没问题HBase 1.3.x 搭配 Hadoop 3.x 就容易出兼容问题。如果使用了 HBase 2.x Hadoop 3.x检查hbase.unsafe.stream.capability.enforcefalse是否配置。不要随便把 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_ZKtrue那就冲突了。解决方式是二选一要么停掉独立 ZooKeeper让 HBase 自己管要么把HBASE_MANAGES_ZK改为false并让hbase.zookeeper.quorum指向独立 ZooKeeper。RegionServer 掉线通常和内存、磁盘、时间同步有关。日志里如果出现RegionServer is exiting、OutOfMemoryError、DiskErrorException就要检查虚拟机内存是否不足、HDFS 磁盘是否写满、HBASE_HEAPSIZE是否设得太大导致系统 OOM。伪分布式下如果虚拟机只有 2GB 内存同时跑 NameNode、DataNode、HMaster、HRegionServer、ZooKeeper很容易内存不够。给到 4GB 以上会稳很多。6.3 常用排查命令速查表现象优先检查常用命令HMaster 没进程HDFS 是否启动、日志报错jps、tail -f $HBASE_LOG_DIR/hbase-*-master-*.logRegionServer 掉线内存、时间同步、HDFS 磁盘free -h、date、hdfs dfsadmin -reportShell 卡死ZooKeeper 连接、DNS 解析echo ruok16010 打不开HMaster 是否存活、防火墙netstat -tunlp表创建失败HDFS 权限、Region 分配hdfs dfs -ls /hbase、hbase hbck类找不到Hadoop/HBase 版本、类路径hbase classpath、检查HADOOP_HOMEhbase 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.bakHBase 不像某些服务支持热加载大量参数伪分布式学习阶段改配置就老实重启比反复猜要快。另一个经验是如果你在 HDFS 上删除了/hbase目录想重新初始化一定要先停 HBase再删目录再启动。不要在 HBase 运行时删除/hbase否则 RegionServer 会不断报错甚至把 ZooKeeper 里的元数据搞乱。测试环境可以这样重置stop-hbase.sh hdfs dfs -rm -r /hbase start-hbase.sh生产环境不要这么干数据会丢。学习环境里重置是家常便饭但要知道自己在做什么。7.2 从伪分布式扩展到集群时先改什么伪分布式跑通之后如果想把 HBase 扩展到三台机器的完全分布式不要急着一台一台乱改。优先改这几个地方hbase.rootdir从hdfs://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.xml和hdfs-site.xml同步到所有 HBase 节点的conf下。扩展时最容易忽略的是时间同步和主机名解析。伪分布式只有一台机器localhost永远能解析时间也只有一份。到了集群环境任何一台机器时间偏差过大ZooKeeper 会话就可能超时RegionServer 被踢出集群。另一个坑是 HDFS 权限HBase 在集群里通常用专用用户启动要确保这个用户在 HDFS 上有/hbase目录的读写权限。最后再分享一个小技巧如果你不确定 HBase 实际加载了哪些配置可以在启动后查看日志开头HBase 会打印出hbase.rootdir、hbase.zookeeper.quorum、hbase.cluster.distributed等关键参数的最终值。别只盯着hbase-site.xml看日志里打印出来的才是运行时真正生效的配置。踩过几次“配置文件明明改了但没生效”的坑之后我现在每次启动 HBase 都会先扫一眼日志里的配置摘要这个习惯能省下大量来回排查的时间。