HBase伪分布式搭建与核心机制实操指南

📅 发布时间:2026/10/13 13:49:55
HBase伪分布式搭建与核心机制实操指南
1. 项目概述与整体思路1.1 为什么要用伪分布式跑HBase先把话说透生产环境里的HBase几乎都是完整分布式集群几十台甚至几百台服务器HMaster、HRegionServer、ZooKeeper各司其职看起来高大上但对于学习者和做技术验证的人来说这套东西太重了。你装一个完整分布式集群光硬件资源、网络规划、节点同步就要折腾好几天还没开始研究HBase本身就已经被环境搞崩溃了。伪分布式Pseudo-Distributed的意思很简单所有角色都跑在同一台机器上进程是分开的配置文件和真实集群几乎一模一样但物理上只有一个节点。这就像你把一个公司的所有部门都塞进同一间办公室部门之间该有的汇报关系、业务流程一样不落只是空间小了点。对于测试、学习、跑通流程来说这种方式效率最高性价比也最好。我自己折腾HBase前前后后也有几年了从伪分布式入门到后来维护过正式的集群坦白说伪分布式这套东西不但没白学反而帮我打下了很好的基础——因为伪分布式环境下你能清楚地看到每个组件的进程、日志和配置排查问题比在复杂集群里更直观。1.2 这套教程能帮你解决什么问题很多初学者卡在HBase门口问题往往不是HBase本身而是前置环境。HBase依赖Hadoop的HDFS做存储依赖ZooKeeper做协调这三个东西要能互相配合配置项非常多任何一个地方出错启动日志里报的错都让你摸不着头脑。这套测试教程会带你走完一条完整的链路在单机上搭建Hadoop伪分布式环境作为底层的存储层安装并配置HBase让它以伪分布式模式运行理清HBase核心组件的启动流程和角色分工用HBase Shell做一些实操包括建表、数据读写、自动拆分和预分区重点分析WAL预写日志的机制和常见异常整理一份常见问题的排查思路适合谁看刚接触HBase的学生、准备HBase相关面试的开发者、需要在本地做技术验证的工程师都适用。只要你的电脑内存不低于8G推荐16G装上Linux虚拟机或者直接用Mac/Linux系统跟着这套流程走一遍基本能跑通。1.3 技术选型说明HBase的版本选型是个老生常谈但特别重要的事。版本匹配不上HBase连启动都困难更别提测试了。我推荐一套经过大量验证的组合组件版本说明JDK1.864位HBase 1.x/2.x都依赖JDK 8高版本JDK反而会有兼容问题Hadoop2.10.x稳定且兼容性好社区资料最多HBase1.4.x 或 2.1.x学习用1.4.x更稳生产特性看2.xZooKeeper3.4.xHBase内置但推荐单独装便于观察协调过程我实测下来Hadoop 2.10.2 HBase 1.4.13 JDK 8的组合最省心这也是目前网上资料最丰富的版本组合。HBase 2.x系列在API和内部机制上都有改动如果你之前看过一些旧教程照着写可能会遇到不兼容的地方。所以先建议跑通1.4.x把核心概念搞清楚再去看2.x的新特性也不迟。2. 环境准备与Hadoop伪分布式搭建2.1 前置条件JDK、SSH、免密登录在装Hadoop之前先把基础环境准备好。JDK安装在这里就不赘述了但要记住一个关键点JAVA_HOME一定要配好而且Hadoop和HBase都要能引用到同一个JDK。我见过太多人栽在JDK路径问题上——Hadoop启动脚本找不到java或者想用高版本JDK导致HBase无法识别参数。装好JDK后在终端验证一下java -version echo $JAVA_HOME如果JAVA_HOME没输出检查/etc/profile或~/.bashrc确认有类似下面的配置export JAVA_HOME/usr/local/jdk1.8 export PATH$JAVA_HOME/bin:$PATH然后处理SSH。Hadoop伪分布式虽然只有一个节点但NameNode和DataNode之间的通信还是通过SSH协议完成的所以需要配置本机免密登录ssh-keygen -t rsa -P -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys ssh localhost第一次执行ssh localhost会问你确认指纹输入yes就行。之后就能免密登录了。这一步不做好后面启动HDFS时会反复要求输入密码非常烦人。2.2 Hadoop核心配置文件详解Hadoop的配置文件都放在$HADOOP_HOME/etc/hadoop目录下。伪分布式需要改的主要是三个文件core-site.xml、hdfs-site.xml、mapred-site.xml如果不跑MapReduce可以暂时不管。这里只盯着HBase依赖的HDFS部分所以重点配置前两个。core-site.xml里配置NameNode的地址和临时目录configuration property namefs.defaultFS/name valuehdfs://localhost:9000/value /property property namehadoop.tmp.dir/name value/usr/local/hadoop/tmp/value /property /configurationfs.defaultFS决定了HDFS的访问入口HBase的hbase.rootdir后面也要指向这个地址。hadoop.tmp.dir很关键NameNode和DataNode的元数据都存放在这个目录下如果它是默认值系统重启后可能被清空导致NameNode无法启动。hdfs-site.xml里重点配置副本数和NameNode的格式化目录configuration property namedfs.replication/name value1/value /property /configuration在伪分布式模式下只有一个DataNode所以dfs.replication必须设为1否则数据块无法达到副本数要求HDFS会一直处于安全模式警告状态HBase写入会报错。配置完成后先格式化NameNodehdfs namenode -format注意格式化命令只需要执行一次。如果后面某个配置改错了重新格式化会把之前的数据全部清空这也意味着HBase里的数据也没了。所以格式化前要想清楚。启动HDFS并验证start-dfs.sh jpsjps命令会列出当前运行的Java进程你应该能看到NameNode、DataNode、SecondaryNameNode三个进程。然后在浏览器访问http://localhost:9870Hadoop 3.x或http://localhost:50070Hadoop 2.x确认HDFS的管理界面能正常打开。这里有个坑要提醒一下很多初学者以为只启动HDFS就够了但HBase在写入数据时还会依赖HDFS的回收站清理机制、租约恢复机制等如果HDFS没启动HBase进程能起来但写数据会超时。所以这一步必须先验证HDFS是健康的。2.3 镜像站与安装包下载的实操建议下载Hadoop和HBase的安装包千万别去官网硬扛速度慢还容易中断。国内有华为云镜像、清华TUNA镜像等下载速度快很多。具体下载地址不粘贴了搜索对应版本的tar.gz包即可。下载后解压到统一目录并设置环境变量。我的习惯是放在/usr/local/下然后配置软链接这样升级版本时不用改一堆路径。比如tar -zxvf hadoop-2.10.2.tar.gz -C /usr/local/ ln -s /usr/local/hadoop-2.10.2 /usr/local/hadoop环境变量统一写入/etc/profileexport HADOOP_HOME/usr/local/hadoop export PATH$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH这样设置的好处是后面的HBase配置里需要引用Hadoop路径时直接用$HADOOP_HOME变量就行避免路径写死的麻烦。3. HBase安装配置与核心组件3.1 HBase下载与目录规划HBase安装包同样从镜像站下载解压后放在/usr/local下tar -zxvf hbase-1.4.13-bin.tar.gz -C /usr/local/ ln -s /usr/local/hbase-1.4.13 /usr/local/hbase配置环境变量export HBASE_HOME/usr/local/hbase export PATH$HBASE_HOME/bin:$PATH装好之后先看一眼目录结构了解各个目录的职责bin/启动、停止脚本以及hbase shell入口conf/配置文件目录核心是hbase-env.sh和hbase-site.xmllib/HBase依赖的jar包logs/运行日志目录排错时最常光顾的地方3.2 hbase-env.sh配置与JVM参数调整打开conf/hbase-env.sh找到并配置以下内容export JAVA_HOME/usr/local/jdk1.8 export HBASE_MANAGES_ZKtrue export HBASE_HEAPSIZE1GHBASE_MANAGES_ZK是一个容易混淆的配置项。设成true时HBase启动时会自动拉起一个内置的ZooKeeper进程这对伪分布式学习来说最省事。设成false则需要外部启动ZooKeeper。我个人的建议是学习阶段直接用内置ZooKeeper减少一个变量。等到你想模拟真实集群架构时再单独部署ZooKeeper把HBASE_MANAGES_ZK设为false走一遍完整流程。HBASE_HEAPSIZE根据机器内存调整。8G内存的机器给1G或2G都行16G内存可以给2G到3G写测试数据时不容易触发频繁的GC。3.3 hbase-site.xml核心参数详解conf/hbase-site.xml是整个HBase配置的核心每项参数都值得搞清楚含义。下面是一份伪分布式模式的完整配置configuration property namehbase.rootdir/name valuehdfs://localhost:9000/hbase/value /property property namehbase.cluster.distributed/name valuetrue/value /property property namehbase.zookeeper.quorum/name valuelocalhost/value /property property namehbase.zookeeper.property.dataDir/name value/usr/local/hbase/zookeeper-data/value /property /configuration逐项解释hbase.rootdirHBase数据在HDFS上的存储根目录必须以hdfs://开头并指向之前配置的NameNode地址。这里可以指定子路径/hbase避免和HDFS上的其他数据混在一起。hbase.cluster.distributed设为true表示以分布式模式运行伪分布式也属于分布式。如果设为falseHBase跑在单机模式所有数据写在本地文件系统不会真正走HDFS——这个区别在测试时用肉眼就能看出来单机模式没有独立的HRegionServer进程只能在一台机器上模拟一个region server。hbase.zookeeper.quorumZooKeeper的地址列表。伪分布式下填localhost即可。hbase.zookeeper.property.dataDirZooKeeper保存元数据的本地目录。特别注意这个目录不能和HDFS的hadoop.tmp.dir指向同一个目录否则数据会混乱。3.4 端口清单与进程验证HBase启动后会占用一组端口记清楚这些端口对排查问题极其重要。整理一份常用端口清单组件端口说明HMaster Web UI16010浏览器访问查看集群状态HMaster RPC16000HBase客户端连接Master的RPC端口HRegionServer Web UI16020查看RegionServer的Region分布HRegionServer RPC16030RegionServer数据读写RPC端口ZooKeeper2181客户端连接端口启动HBase之前用ss -lntp或netstat -tlnp检查一下端口占用情况。特别是2181端口很多人之前装过其他中间件会把2181占掉导致HBase启动时ZooKeeper报错。启动命令很直接start-hbase.sh然后再次用jps验证你应该看到HMaster主控进程HRegionServer数据服务进程HQuorumPeer内置ZooKeeper进程因为设置了HBASE_MANAGES_ZKtrue之前启动的NameNode、DataNode也还在打开浏览器访问http://localhost:16010如果能看到HMaster的管理界面并显示一个RegionServer在线说明HBase已经成功以伪分布式模式运行了。4. WAL预写日志机制解析与异常排查4.1 WAL到底是干什么的WALWrite-Ahead Log预写日志是HBase保证数据不丢失的核心机制。HBase的写入流程可以概括为当客户端发起一次写入请求数据并不会直接落到磁盘上的HFile而是先追加写入WAL日志文件写入成功后再写入内存中的MemStore。这个过程用生活化的类比来说就像你写日记之前先录一段语音备忘——语音记录是最先落地的后面再慢慢整理成正式的日记。如果整理过程中出了意外你还能靠语音重新整理不至于什么都丢了。WAL日志的默认存储路径可以从配置推断出来。HBase通过hbase.wal.dir参数指定如果没配置就默认放在hbase.rootdir下的/WALs目录。所以你可以用以下命令在HDFS上看到它hdfs dfs -ls /hbase/WALs你会看到每个RegionServer对应一个以机器名端口命名的子目录里面就是该RegionServer正在写的WAL文件。4.2 WAL的三个核心配置参数在hbase-site.xml里以下三个参数直接关系到WAL的行为property namehbase.regionserver.hlog.blocksize/name value33554432/value /property property namehbase.regionserver.hlog.slots/name value4/value /property property namehbase.regionserver.hlog.maxlogsize/name value335544320/value /property简单解释一下hlog.blocksizeWAL中每个日志块的大小默认32MB。当一个日志文件的大小累计到接近maxlogsize时会触发滚动即关闭当前日志文件并创建新的日志文件。hlog.slots每个RegionServer上可以用来并行写WAL的槽位数。写操作在一定条件下可以被分配到不同的槽位提高并发能力。hlog.maxlogsizeWAL日志文件的上限默认320MB。超过这个大小会触发日志滚动并把旧的、已经持久化的日志清理掉。在学校里老师不会讲那么细但面试时如果被问到WAL的机制能说出maxlogsize和日志滚动的关系分数会高很多——因为考官知道你是真的在底层摸过而不只是背概念。4.3 WAL预写日志异常的典型场景与处理热词里出现了“hbase wal预写日志异常”这确实是测试中很容易踩的坑。归纳成三类典型情况第一类WAL路径不存在或权限不足现象HBase启动时日志报错提示无法创建WAL文件。原因通常是HDFS上/hbase目录创建失败或者hadoop用户对HDFS根目录没有写权限。排查方式hdfs dfs -ls / hdfs dfs -mkdir -p /hbase hdfs dfs -chmod -R 755 /hbase如果目录创建好了再用HBase Shell写入一条数据测试观察日志输出。第二类WAL日志写入慢导致写入超时现象客户端写入数据时一直超时查看RegionServer日志会发现很多有关WAL sync的提示。这种情况在伪分布式环境里很常见因为单机上的磁盘I/O既要支撑HDFS写入又要支撑HBase自身的WAL写入。特别是虚拟机环境下磁盘I/O性能偏差数据写入时经常会卡在WAL sync这个环节。处理办法一是给机器多分配一些内存让MemStore有更大的缓冲空间二是在配置里开启异步WALproperty namehbase.regionserver.option.ingenious/name value128M/value /property不过说句实话伪分布式本质上就是单机统一跑所有组件I/O瓶颈是物理上的通过配置优化只能缓解没法消灭。测试时不要把写入并发调得太高不然卡是必然的。第三类WAL文件损坏或无法恢复现象集群重启后RegionServer启动失败日志提示WAL replay失败。这种情况在正常关闭时很难遇到但如果之前做过kill -9强杀进程或者磁盘空间满了就会触发。排查思路先确认磁盘空间是否充足df -h看看。然后看/hbase/WALs下有没有异常文件必要时把数据备份后清理掉。伪分布式测试环境下如果WAL里没有重要数据直接清空恢复也是可以接受的。4.4 从WAL触发的一次故障排查实录有一次我在测试环境里做数据写入压测写到一半机器突然断电重启后发现HBase的RegionServer一直起不来。查看日志发现报错信息指向某个WAL文件无法读取。我当时的处理流程是先确认HDFS状态正常hdfs dfsadmin -report确认DataNode联机磁盘空间足够找到报错的WAL文件hdfs dfs -ls /hbase/WALs/发现有一个文件大小为0字节明显是断电时写入中断造成的用hbase hbck检查集群状态确认元数据是否有问题由于测试数据本身不重要直接把这个损坏的WAL文件挪到备份目录然后重启HBase重启后一切正常。但这次经历让我意识到WAL损坏最关键的不是怎么修而是区分数据要不要抢救。如果里面有重要数据就不能简单丢弃需要尝试用hbase org.apache.hadoop.hbase.mapreduce.ImportTsv之类的工具做恢复如果只是测试数据直接清理掉效率最高。5. HBase Shell实操从建表到预分区5.1 进入Shell与基本命令环境跑通之后真正的重头戏是HBase Shell操作。在终端输入hbase shell看到hbase(main):001:0的提示符就对了。先用几个基础命令熟悉一下status version liststatus返回集群状态能看到在线RegionServer数量list列出所有表名刚安装完是空的。5.2 建表语句与列族设计HBase建表的思维和关系型数据库完全不同。一张表只定义表名和列族Column Family不需要预先定义列。具体有哪些列完全由写入的数据决定。这就是HBase所谓“稀疏存储”的核心每一行可以有不同的列空值不占空间。建一张简单的用户信息表create user_info, base_info, ext_info这里创建了两列族base_info放基础信息姓名、年龄、性别等ext_info放扩展信息爱好、签到天数等。为什么规划列族很重要因为HBase的存储以列族为单位一个列族的数据物理上集中在一起。如果一张表设计了太多列族或者列族之间的数据量级差异巨大比如一个列族几万行另一个列族几百万行会导致Region的读写出现严重倾斜。生产环境的表一般1到3个列族就足够了。5.3 数据写入与读取的完整操作插入一条数据put user_info, row1, base_info:name, 张三 put user_info, row1, base_info:age, 28 put user_info, row1, ext_info:hobby, 阅读注意put语句的格式表名、行键、列族:列名、值。在HBase中行键RowKey是唯一标识一行的字段设计得好不好直接影响读写性能。读取数据的方式有几种get user_info, row1 scan user_infoget是精确查询根据行键直接定位到一行scan是范围扫描或全表扫描。平时开发中这两种方式占到九成以上。如果在get时只想取一个列族或某个列可以这样get user_info, row1, {COLUMN base_info} get user_info, row1, {COLUMN base_info:name}5.4 自动拆分与预分区面试和实战都绕不开的考点热词里“hbase shell 操作自动拆分和预分区”出现频率很高这也是HBase运维和开发绕不开的基本功。HBase的Region是表数据分片的最小单位。当一张表的Region变得过大时会自动拆分成两个Region。默认的拆分策略是当一个Region的数据量超过阈值时从中间某个点拆开分成大小相近的两个Region。这个机制叫自动拆分Auto Splitting。伪分布式环境下可以这样观察自动拆分create auto_split_test, cf, {NUMREGIONS 1}然后连续写入不同行键的数据过一段时间后用status detailed查看Region数量变化。你会看到原本的一个Region变成了两个中间那条分界线大致在行键区间的中点附近。**预分区Pre-splitting**是我很推荐在生产环境使用的技巧。它和自动拆分的区别在于自动拆分是数据写多了才分裂预分区是在建表时就规划好Region的数量和范围。为什么要预分区因为自动拆分的过程会触发Region的重新分配和负载均衡这个过程中客户端访问会短暂受到一些延迟影响。如果一个表能预判未来数据的分布范围直接分成多个Region写入压力一开始就能均匀分散还能避免启动阶段突然的大量split操作。预分区的操作方式有两种。第一是指定拆分点create user_info, base_info, {SPLITS [a, m, z]}这会创建4个Region行键分布分别是从最小值到a之前a到m之前m到z之前z到最大值第二种方式是通过文件指定拆分点适合拆分点特别多的场景create user_info, base_info, {SPLITS_FILE /usr/local/hbase/splits.txt}splits.txt里面每行一个拆分点。预分区里有个很关键的设计原则拆分点的选择要贴合业务数据的行键特征。比如你的行键是手机号开头三位是运营商号段那就可以按号段分布来拆分如果行键是用户ID的MD5值那就尽量均匀切分。我在测试中发现很多新手喜欢按a、m、z这种字母拆分看起来很规整但实际业务行键如果全是数字开头这种拆分就毫无意义数据还是会全挤到前几个Region去。回调一下之前的user_info表可以这样给它做预分区create user_info_v2, base_info, {NUMREGIONS 6, SPLIT_ALGO HexStringSplit}NUMREGIONS指定Region数量SPLIT_ALGO指定拆分算法。HexStringSplit适合行键是十六进制字符串的场景。5.5 表结构的修改与清理测试过程中经常要改表结构比如增加一个列族alter user_info, {NAME new_cf}删除一张表时必须先禁用再删除disable user_info drop user_info这个两步式设计是为了保护数据。禁用状态下HBase会拒绝任何读写操作这样删除操作不会误伤正在执行的业务请求。5.6 Shell测试阶段的一个小场景演练我习惯在测试环境模拟一个简单场景用HBase存一批订单数据然后做查询对比验证预分区的效果。这里贴一个可以直接跑的脚本片段create order_test, order, {SPLITS [1000, 2000, 3000, 4000]} put order_test, 1001, order:amount, 99.5 put order_test, 1002, order:amount, 199.0 put order_test, 2001, order:amount, 299.5 put order_test, 3001, order:amount, 399.0 put order_test, 4001, order:amount, 499.5 scan order_test如果你查看status detailed会发现这些数据分散到了不同的Region里。这就是预分区的直观效果——行键落在哪个范围就写入对应的Region不会像单Region那样出现热点。6. 常见问题排查与避坑实录6.1 HMaster启动后闪退的常见原因HBase启动后HMaster进程立刻退出是伪分布式环境里遇到最多的故障。根据我的经验按概率排序原因依次是原因一HDFS没启动或路径不对执行jps确认NameNode和DataNode是否在线。如果没在线HBase的rootdir无法访问HMaster启动时连接HDFS会失败然后自动退出。解决方法是先启动HDFS再启动HBase。原因二ZooKeeper数据目录冲突查看HMaster日志如果出现类似FileSystem has not been fully initialized或者ZooKeeper相关的异常多半是hbase-site.xml里hbase.zookeeper.property.dataDir配置了不存在的目录或权限有问题。给这个目录赋权mkdir -p /usr/local/hbase/zookeeper-data chmod -R 755 /usr/local/hbase/zookeeper-data原因三端口冲突HBase的16000端口被别的进程占用了。用lsof -i:16000查看占用进程把冲突进程关掉或者调整HBase的端口配置。6.2 RegionServer上线后马上掉线的排查思路HMaster起来了但RegionServer过一会儿掉线HMaster界面上显示dead server。这种情况我在伪分布式测试里也碰到过。最直接的办法是看RegionServer的日志文件存放在$HBASE_HOME/logs/下文件名类似于hbase-hadoop-regionserver-machinename.log。高频的报错有两类第一类是内存溢出OOM。RegionServer是内存大户堆内存设置太小的话写入压力一大就可能OOM。调整hbase-env.sh里的HBASE_HEAPSIZE设到2G或更高。第二类是HDFS文件句柄数超限。ulimit -n的值太小RegionServer和HDFS之间建立连接太多超过限制后处理不过来。可以在/etc/security/limits.conf里调大或者临时执行ulimit -n 65535。6.3 时钟跳变导致RegionServer认证失败HBase的RegionServer和HMaster之间有RPC通信Kerberos认证虽然伪分布式默认不开启和时间戳校验都对系统时间敏感。如果你用的是虚拟机宿主机休眠过久或NTP服务没配好虚拟机时间可能会出现较大偏移导致RegionServer无法通过Master的请求校验。排查方式看日志里有没有类似Clock skew的报错。修复方式是统一时间date然后手动校时或配置NTP服务。伪分布式环境虽然只有一个节点但Master和RegionServer在逻辑上是两个角色它们之间的时钟偏移同样会被检测所以不要以为单机就一定没有时钟问题。6.4 常见问题速查表整理一个速查表方便对照排查症状可能原因解决方向HMaster启动立即退出HDFS未启动、rootdir错误启动HDFS检查hbase.rootdirRegionServer反复掉线堆内存过小、文件句柄不足调大HBASE_HEAPSIZE调高ulimit建表报错Region in transitionZooKeeper会话超时检查网络和ZooKeeper状态写入数据超时WAL sync慢、磁盘I/O瓶颈降低并发检查磁盘空间数据无法读取表字段写错、列族名错误查看scan输出的列族结构6.5 日志文件这样看效率最高很多新手遇到问题就发慌这里分享一个我看日志的习惯先看HMaster的日志再去看出问题的RegionServer日志最后看ZooKeeper的状态。定位基本就是靠这个顺序。HMaster日志里写的是整个集群层面的状态变更比如RegionServer上下线、表创建和删除RegionServer日志里写的是单个节点的读写异常、内存和磁盘状态。ZooKeeper的问题会导致多个组件同时报错如果多个组件的日志里都提到了ZooKeeper那基本就能锁定ZooKeeper会话过期或数据目录损坏。HBase日志本身也是分级的测试的时候建议把hbase.rootdir.logger设为DEBUG能输出更多细节。不过生产环境别开DEBUG日志量太大反而影响排查。7. 从伪分布式到生产集群的扩展思考7.1 伪分布式测试学会了什么走完上面的流程你至少应该掌握这些技能搭好一个Hadoop伪分布式存储层让HBase正确运行在上面通过shell建表、设计列族、预分区理解WAL的机制能在异常时定位日志并处理。这些是HBase的通用能力不区分伪分布式还是全分布式。相比直接上一套复杂集群伪分布式让你在出错时能更快定位——进程数量少日志对应关系清晰每一个组件的启动顺序、端口、依赖关系都能用最小成本观察清楚。7.2 后续可以往前推进的三个方向方向一Sqoop对接HBase热词里也有“sqoop 操作 hbase”。Sqoop是用来在Hadoop生态和关系型数据库之间做数据迁移的工具。伪分布式环境里你完全可以起一个MySQL然后用Sqoop把MySQL的订单表导入到HBase里。这一步做完你对HBase作为分析型数据落地存储的价值会有更直观的理解。实际导入命令大致是sqoop import --connect jdbc:mysql://localhost:3306/test_db \ --username root --password 123456 \ --table order_table \ --hbase-table order_hbase \ --column-family cf \ --hbase-row-key id \ --hbase-create-table方向二从HBase 1.x迁移到2.x如果有精力建议在跑通1.4.x之后再搭一套HBase 2.1.x环境对比一下两个版本在配置项、Region拆分策略、读写模型上的差异。2.x里引入了offheap读写路径、优化了WAL的机制对理解HBase的演进方向很有帮助。方向三写一个简单的Java客户端读写程序Shell本质上是一个交互式客户端真实的HBase应用还是通过Java API或者别的客户端来访问的。写一个简单的Demo用ConnectionFactory创建一个连接然后做put和get操作代码量不多但能帮你把Shell里学到的概念映射到真实开发中去。Configuration conf HBaseConfiguration.create(); conf.set(hbase.zookeeper.quorum, localhost); Connection connection ConnectionFactory.createConnection(conf); Table table connection.getTable(TableName.valueOf(user_info)); Put put new Put(Bytes.toBytes(row2)); put.addColumn(Bytes.toBytes(base_info), Bytes.toBytes(name), Bytes.toBytes(李四)); table.put(put); Get get new Get(Bytes.toBytes(row2)); Result result table.get(get); System.out.println(Bytes.toString(result.getValue(Bytes.toBytes(base_info), Bytes.toBytes(name)))); table.close(); connection.close();7.3 测试环境数据管理的个人经验最后分享一个我踩过多次坑后总结的习惯测试环境的HBase数据目录尽量和Hadoop的临时数据隔离并定期清理。伪分布式环境下HDFS的/hbase目录会保存所有的表数据、WAL日志和快照。如果你反复建表、灌数据、删表目录膨胀非常快磁盘占满后HBase基本就废了。清理时不要直接用hdfs dfs -rm -r /hbase先把HBase停掉再删HDFS数据然后重新格式化NameNode如果不需要保留HDFS上的其他数据的话。这个顺序颠倒了可能造成HDFS数据文件残留与HBase元数据不一致启动时会出现各种奇怪错误。我自己的做法是每完成一个阶段性的测试就留一个结尾步骤把环境重新清干净。这样每次测试都是从干净环境开始出问题时能排除“是不是上次测试留下了脏数据”这种变量。如果你打算长期在本地玩HBase强烈建议也养成这个习惯。伪分布式HBase测试并不复杂关键是把每一步的原理吃透出了问题能从日志和机制层面找到原因。这套环境搭好之后你后面无论是学HBase调优、看源码、还是往分布式集群方向深入都会有一个很扎实的底层认知。如果搭建过程中遇到什么具体问题欢迎带着日志来讨论一起把坑填平。