简介这份资源是一份HBase实验报告PDF面向正在学习Hadoop生态、希望掌握HBase Shell基本操作的大数据初学者也适合作为课程实验的参考模板。报告以创建student表为例完整演示了建表、插入数据、按行键查询指定字段等核心命令并记录了启动HBase Shell时可能遇到的环境配置问题及排查思路帮助读者快速理解NoSQL数据库在分布式存储中的基本使用方式。资源共1个文件类型为PDF文档压缩包整体大小约454KB内容精简、结构清晰适合直接阅读或对照练习。已有4238人学习浏览是入门HBase Shell操作时较为实用的参考资料。通过阅读这份报告读者可以掌握create、put、get等常用命令的用法了解HBase中行键、列族等基本概念同时借鉴实验格式与问题讨论部分为后续深入学习HBase高级特性打下基础。1. 一份 HBase 实验报告的价值在于把安装、Shell 操作和故障现场串成一条可复现链路《HBASE实验报告.pdf》这个标题看起来很朴素但它背后覆盖了一整套从零到一的过程HBase 安装与配置、启动时常见的 master initialing 卡住、Shell 建表与读写、自动拆分和预分区、WAL 预写日志异常恢复最后再加一层 Sqoop 把关系库数据倒进 HBase 做综合测试。把这些串起来新手能把 HBase 从“黑匣子”变成“能动手验证的系统”熟手则能通过报告里的参数和故障记录快速判断一份部署方案有没有可靠性隐患。这篇文章就按一份能拿得出手的实验报告来组织先落地环境再做 Shell 操作然后主动制造一次 WAL 异常最后补上 Sqoop 导入和验证技巧。你跟着做一遍写出来的 PDF 不只是命令回显截图而是有判断、有对比、有结论的实验记录。2. HBase 安装与配置从选型到把 master initialing 卡点排掉2.1 本地实验为什么先选 standalone 模式HBase 有 standalone、伪分布式、完全分布式三种常见跑法。实验报告里大部分人用的是 standaloneHMaster、HRegionServer、ZooKeeper 都跑在同一个 JVM 进程里不依赖外部 HDFS配置最少出问题最好排查。对第一次做 HBase 综合测试的人来说这也是风险最低的起点。我一般建议把 JDK 和 HBase 解压目录先固定下来。很多实验翻车不是因为 HBase 本身而是机器里有多个 JDKHBase 启动脚本挑了一个不兼容的版本。解压之后第一件事就是改conf/hbase-env.sh把 JAVA_HOME 写死。Windows 上则改conf/hbase-env.cmd。# 解压后进入 HBase 根目录 cd /opt/hbase-2.x.x # Linux/macOS 编辑 conf/hbase-env.sh取消注释并写死 JDK 路径 vim conf/hbase-env.sh # export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 # 提前建好实验数据目录 mkdir -p /data/hbase这一步的逻辑很直接standalone 模式下 HBase 自己管理 ZooKeeper数据落地到本地文件系统所以 rootdir 和 ZooKeeper dataDir 都要指向一个可写的绝对路径。如果这两项不配HBase 会默认写到/tmp重启一次丢一次数据实验记录就没法复现。2.2 最小 hbase-site.xml 配置与启动操作接着编辑conf/hbase-site.xml。实验报告里不需要贴一大堆参数只贴真正影响行为和排障的配置即可。少了会让人怀疑你没跑通多了又显得没有主次。configuration property namehbase.rootdir/name valuefile:///data/hbase/value descriptionstandalone 模式把 HBase 数据落在本地磁盘/description /property property namehbase.zookeeper.property.dataDir/name value/data/hbase/zookeeper/value descriptionZooKeeper 快照目录master initialing 卡死时优先看这里/description /property property namehbase.zookeeper.property.clientPort/name value2181/value /property /configuration参数说明hbase.rootdir表示 HBase 数据根目录这里用file://前缀明确走本地磁盘如果写成hdfs://...但本地没有 Hadoop 集群启动会一直卡在连接 HDFS。hbase.zookeeper.property.dataDir是 ZooKeeper 存事务日志和快照的目录很多 master 初始化异常都跟这个目录里的旧状态有关单独配置有利于清数据重来。配置完成后启动cd /opt/hbase-2.x.x/bin ./start-hbase.sh # 验证进程是否齐全 jps正常应该看到 HMaster、HRegionServer、HQuorumPeer 三个进程。HQuorumPeer 是 HBase 自带 ZooKeeper 的进程名如果它没起来HMaster 和 HRegionServer 再往后也会退掉。Windows 下用start-hbase.cmd进程验证用jps或任务管理器里的 Java 进程都能看到。2.3 启动时卡在 master initialing端口与日志定位第一次启动 HBase网页管理端经常停在master-initialization状态这是热词“hbase 出现 master initialing”背后最常见的问题。遇到这个状态别急着重启先看logs/下的 master 日志。cd /opt/hbase-2.x.x/logs ls -lh grep -i master-initialization\|Failed to become active master *.log如果日志里出现Failed to connect to the meta table或 Zookeeper 连接异常一般是两类原因一是hbase.rootdir指向的目录不可写或者里面有上个实验留下的坏数据二是 ZooKeeper dataDir 里的状态和当前 rootdir 不一致。常见处理方式是实验机上数据不心疼就停掉 HBase把/data/hbase下旧内容清掉再重新启动。生产环境绝对不要这么干实验报告里注明“仅限本地验证环境”即可。# 实验环境快速重置生产环境勿用 cd /opt/hbase-2.x.x/bin ./stop-hbase.sh rm -rf /data/hbase/* ./start-hbase.sh这步做完网页访问http://localhost:16010能看到 Active Master 并且 Regions 列表出现hbase:meta就说明初始化完成。实验报告里应该贴一次这个页面同时把端口说明写清楚HMaster RPC 默认 16000HMaster Web UI 默认 16010RegionServer RPC 默认 16020RegionServer Web UI 默认 16030ZooKeeper 默认 2181。如果照着旧教程做端口可能还是 60010、60020判断时以本机配置为准。3. HBase Shell 操作自动拆分、预分区和综合测试的必写细节3.1 Shell 建表参数列族、版本、TTL 写成实验变量实验报告的中间段落最值得写的是 HBase Shell 操作因为它是 HBase 数据模型的直观体现。Shell 里建表不像 MySQL 那样定义一堆列而是定义列族。每个列族独立设置 VERSIONS 和 TTL这些参数直接影响后续读写行为和存储量。下面这段可以作为一个标准用例写进报告hbase shell EOF create stu, {NAME info, VERSIONS 3}, {NAME score, TTL 86400} put stu, 001, info:name, zhang put stu, 001, info:age, 20 put stu, 001, score:math, 90 scan stu get stu, 001 EOF逻辑说明创建表stu列族 info 保留最多 3 个历史版本列族 score 设置 TTL 为 86400 秒也就是一天后数据自动过期。put 的时候行键是001列由“列族:修饰符”组成例如info:name和score:math。scan 是扫全表get 是拿单行。这里有个值得写进报告的对比点如果对同一列连续 put 两次再 scan 只能看到最新值但用 get 指定 VERSION 能看到旧值。hbase shell EOF put stu, 001, info:age, 21 get stu, 001, {COLUMN info:age, VERSIONS 3} EOF参数说明VERSIONS 3不是保留三次修改记录而是每个 cell 最多保留 3 个时间戳版本超出后最老版本会被合并清理。实验报告中可以让两次 put 之间 sleep 几秒再展示{VERSIONS 3}的结果这样时间戳差异一眼能看出来。3.2 自动拆分和预分区同一张表里做分布对比HBase 数据按行键分布到 RegionRegion 又是 HBase 负载均衡和并行的基本单位。实验报告里只要涉及“综合测试”一定会碰到表性能问题这时候自动拆分和预分区就得拿出来做对比。预分区的做法是建表时直接指定拆分边界hbase shell EOF # 按学号前两位拆成 4 个预期分区边界为 010、020、030 create stu_split, {NAME info, VERSIONS 3}, SPLITS [010, 020, 030] # 查看 Region 分布 list stu_split EOF逻辑说明SPLITS [010,020,030]的意思是行键字典序小于010的进第一个 Region010到020之间进第二个依此类推。HBase 比较行键时按字节序比较不是按数值大小。所以行键如果设计成001、002这种短字符串它们全部落在第一个 Region预分区效果就不明显。自动拆分则是让 RegionServer 根据文件大小决定是否把一个 Region 一分为二。默认阈值是hbase.hregion.max.filesize通常为 10GB。实验数据量根本达不到这个量级所以自动拆分往往“看起来没生效”。要演示拆分有两种办法一是把阈值调小二是手动触发split命令。hbase shell EOF split stu_split EOF这个命令执行后RegionServer 会对表里最大的 Region 发起拆分。实验报告里应该记录拆分前后的 Region 数量体现“拆分只是把数据分成更多管理单元数据本身没有迁移”这个关键点。3.3 综合测试用例编排用批处理脚本跑完整读写删链路综合测试不是把命令随便敲一遍而是要有明确用例。我习惯把测试命令写进一个文本文件再用hbase shell file批量执行。这样实验报告可以附带这个脚本其他人拿到后能原样复现。cat hbase_test.txt EOF create test_data, {NAME cf, VERSIONS 3}, SPLITS [010, 020, 030] put test_data, 011, cf:name, zhang put test_data, 021, cf:name, li put test_data, 031, cf:name, wang put test_data, 041, cf:name, zhao count test_data scan test_data, {LIMIT 5} get test_data, 021 delete test_data, 021, cf:name scan test_data, {LIMIT 5} EOF hbase shell hbase_test.txt逻辑说明脚本里覆盖了建表、写入、计数、扫描、单行读取、删除六类操作。{LIMIT 5}表示 scan 最多返回 5 行避免大数据量时终端被刷爆。delete 删除的是指定列不是整行要删整行用deleteall。这个细节适合写进报告的“操作注意”小节。参数说明这里建表时给了预分区主键用了011、021、031分别落在三个不同 Region所以写入能分散到不同 RegionServer 的 Region 上。如果不开预分区又要强调写入性能测试结果会非常难看因为所有写请求都堆在同一个 Region 上。实验报告里最好把预分区和不预分区两种情况各跑一次用 Scan 的行数一致但 Region 数量不同来做结论支撑。4. HBase WAL 预写日志写入链路、wal 路径与异常恢复实验4.1 WAL 在写入链路里的位置为什么它比内存更重要热词里有一个“hbase wal 预写日志异常”说明很多人实际踩过 WAL 的坑。WAL 全称 Write-Ahead Log也就是预写日志。HBase 收到 put 请求后不会立刻把数据写进磁盘上的 HFile而是先写入内存中的 MemStore同时把这次写操作追加到 WAL 文件里。如果 RegionServer 突然宕机MemStore 里还没落盘的数据会丢但 WAL 文件里已经有完整记录。RegionServer 重启后HMaster 会把这个 RegionServer 的 WAL 文件按 Region 拆分再把里面的操作重放到新的 RegionServer 上。没有 WALHBase 的“高可用”就是空话。实验报告里讲 WAL不需要从源码角度复述但要把这个链路画清楚写入请求到达 RegionServer先写 WAL再写 MemStoreMemStore 达到阈值后 flush 成 HFile。只要 WAL 写入成功客户端就可以认为数据已持久化。这个“先日志后数据”的顺序是 WAL 名字的由来。4.2 WAL 路径与相关参数日志里怎么找 wal 文件当hbase.rootdir配成file:///data/hbase时WAL 默认目录就是/data/hbase/WALs。每个 RegionServer 都会在 WALs 下建一个以“主机名,端口,时间戳”命名的子目录。如果 HBase 跑在 HDFS 上对应路径就是 HDFS 里的/hbase/WALs。# 本地文件系统模式下查看 WAL 文件 ls -lh /data/hbase/WALs # 也可以去 RegionServer 日志里搜 WAL 写入路径 grep -i Creating writer\|FSLog /opt/hbase-2.x.x/logs/*regionserver*.log日志里能看到类似Creating writer with logFileNum..., path/data/hbase/WALs/...的行。这个路径信息对排查 WAL 异常很重要因为一旦 WAL 目录权限不对或者被误删RegionServer 会反复报错并拒绝写入。实验中还可能看到热词里的“hbase wals路径”问题明明配置没问题但 WALs 目录在某个时间点消失了。常见原因是手动清理/data/hbase时把 WALs 一并删了或者磁盘空间不足导致 RegionServer 主动 abort。看到这种情况先看磁盘写满没有再看 HBase 日志里的Failed to create new WAL file。4.3 主动制造一次 WAL 异常观察恢复过程并写进报告光讲 WAL 怎么工作还不够合格的实验报告应该主动制造一次 RegionServer 异常退出再观察 WAL 如何参与恢复。做法分三步。第一步在 Shell 里持续写入数据第二步直接 kill 掉 RegionServer 进程第三步重启 RegionServer再查询之前写入的数据是否还在。# 会话 1写数据 hbase shell EOF put test_data, 011, cf:status, before_kill put test_data, 021, cf:status, before_kill EOF # 会话 2找到 RegionServer 进程并强制杀掉模拟宕机 jps | grep HRegionServer kill -9 pidkill -9 之后RegionServer 没有机会做任何清理MemStore 里的数据残留和 WAL 文件会原样留在磁盘上。再启动 HBase日志里会出现 log splitting 相关过程这是 HMaster 在把崩溃 RegionServer 的 WAL 文件按 Region 拆分并重放。# 重启后验证数据是否恢复 hbase shell EOF get test_data, 011, {COLUMN cf:status} get test_data, 021, {COLUMN cf:status} EOF逻辑说明如果两次 get 都能返回before_kill说明 WAL 重放成功如果返回null说明 WAL 被禁用或者数据因强制 kill 前的配置问题丢失。这个实验结果非常适合写进报告因为它用故障现象证明了 WAL 的价值。要说明一个重要参数Shell 的 put 命令可以通过{WAL false}临时跳过 WAL 写入。这是压测时提高吞吐的常见手段但代价是崩溃时丢数据。实验报告里可以做一组对比普通 put 一批数据后 kill数据恢复关闭 WAL 后 put 一批数据再 kill数据丢失。这个对比最有说服力也直接回扣“hbase wal预写日志异常”的排查场景。hbase shell EOF put test_data, 031, cf:status, no_wal_data, {WAL false} EOF参数说明{WAL false}让这次 put 不写 WAL只进 MemStore。这样的数据在进程正常时没有问题一旦 RegionServer 异常宕机MemStore 还没 flush 成 HFile 的部分就会丢。实验报告里记录这个对比时一定要注明“仅在实验环境验证生产不建议关闭 WAL”。5. 避坑注意与排查master initialing、端口清单和预分区不生效的五类典型问题5.1 master initialing 卡死不是玄学先看日志再看 ZooKeeper现象启动 HBase 后jps能看到 HMaster 进程但 Web UI 一直显示master-initialization表操作全部拒绝。原因HMaster 初始化阶段要读取hbase:meta表并连接 ZooKeeper。rootdir 里残留旧数据、ZooKeeper dataDir 状态损坏、或者文件权限不对都会让初始化卡住。日志里通常有Failed to become active master或connection refused。解决先查日志定位具体异常不要盲目重启。数据不重要时停服后清理 rootdir 和 ZooKeeper dataDir 再重启是最快的实验复位方式。cd /opt/hbase-2.x.x/bin ./stop-hbase.sh rm -rf /data/hbase/* # 本地实验环境专用于重置 ./start-hbase.sh5.2 端口清单全开了Shell 依然连不上或 Web 打不开现象防火墙已放行 2181、16010、16020但hbase shell执行 list 超时网页也打不开。原因端口号跟教程对不上。HBase 1.x 和 2.x 的默认端口不同如果你按 1.x 教程配了 60010而本机是 2.x页面自然打不开。另一个常见原因是 ZooKeeper 的 2181 端口被其他进程占用HMaster 起不来RegionServer 也没注册。解决以实际配置为准查清当前进程监听端口。netstat -nlt | grep -E 2181|16000|16010|16020|16030用途默认端口相关配置项HMaster RPC16000hbase.master.portHMaster Web UI16010hbase.master.info.portRegionServer RPC16020hbase.regionserver.portRegionServer Web UI16030hbase.regionserver.info.portZooKeeper 客户端2181hbase.zookeeper.property.clientPort实际看到 16010 和 16030 在监听再决定是不是 Web 地址输错。实验报告里贴netstat输出比只贴启动日志更让人信服。5.3 开了自动拆分数据却始终挤在一个 Region现象表创建很久数据也写了不少但 Web UI 上 Region 数量始终不变所有请求都打到同一个 Region。原因自动拆分阈值默认是hbase.hregion.max.filesize实际默认值通常是 10GB。实验数据只有几百 MB远没有达到触发条件。自动拆分不是一个“定时任务”而是写入时检查 Region 是否超过阈值没超就不会拆。解决把阈值调小到 100MB 左右重启生效再写入数据观察拆分日志。property namehbase.hregion.max.filesize/name value104857600/value /property参数说明104857600 字节等于 100MB。实验数据超过这个大小后RegionServer 会对最大 Region 发起拆分成两个子 Region。这个调整只适合实验验证生产环境频繁拆分反而增加管理开销。5.4 预分区设置了 SPLITS大量数据还是落到最后一个 Region现象建表时给了SPLITS [010, 020, 030]但写入自增数字型行键后数据全堆在最后一个 Region。原因行键是顺序自增的例如00001、00002、00003它们在字典序上不断增大最终都越过所有拆分边界落到最后一个 Region。预分区能解决“初始 Region 数量”问题解决不了“热点写入”问题。解决行键加盐或反转。加盐是在行键前拼一个随机或取模前缀让数据分散到不同 Region反转适用于定长有序键把键倒过来打散顺序。实验报告里建议只写结论不要过度设计。5.5 WAL 目录异常导致 RegionServer 反复重启现象RegionServer 启动后立刻退出日志里反复出现Failed to create new WAL file或Unable to write WAL。原因WAL 目录无权写入、磁盘写满、或者hbase.rootdir指向外部存储但外部存储不可用。很多 Windows 实验机上磁盘剩余空间不足或杀毒软件锁文件也会触发这个现象。解决先确认磁盘和目录权限再把 WAL 目录单独指到本地可写位置。df -h /data/hbase ls -ld /data/hbase/WALs chmod -R 755 /data/hbase修改权限后重启 RegionServer。检查日志里是否还出现 WAL 路径相关异常没有再继续压测写入。这条经验适合写进报告的“故障记录”章节因为 WAL 异常是综合测试里最能体现数据可靠性意识的部分。6. 用 Sqoop 把 MySQL 数据灌进 HBase给实验报告加一个综合联动场景6.1 为什么综合测试值得加一段 Sqoop 导入前面 Shell 实验的数据都是手工 put 的数据量太小看不出 HBase 批量导入和查询的特点。加一个 Sqoop 导入环节直接从 MySQL 拉一张表进 HBase等于把实验从“单组件操作”升级成“数据迁移联动”。同时也能覆盖“sqoop 操作 hbase”这个方向里最常见的场景关系数据库到 HBase 的数据搬运。6.2 最小可复现命令MySQL 到 HBase 全流程先保证 MySQL 里有表并确认 Sqoop 的 lib 目录下放了 HBase 相关 jar。缺少 jar 时 Sqoop 会在导入阶段报找不到 HBase 类的错误这是这个环节最常见的坑。sqoop import \ --connect jdbc:mysql://localhost:3306/edu \ --username root \ --password root123 \ --table student \ --hbase-table stu_from_mysql \ --column-family info \ --hbase-row-key id \ --hbase-create-table \ --split-by id \ --m 2参数说明--hbase-table指定 HBase 目标表--column-family指定所有列落入的列族--hbase-row-key把 MySQL 主键字段作为 HBase 行键--hbase-create-table表示目标表不存在时自动创建--split-by用于指定并发切分的字段--m 2表示两个并行任务。导入完成后用 HBase Shell 验证。hbase shell EOF list scan stu_from_mysql, {LIMIT 10} count stu_from_mysql EOFMySQL 侧再数一次总行数做比对mysql -e select count(*) from edu.student;把 HBase 的 count 结果和 MySQL 的 count 结果放一起能直接验证数据是否完整落地。6.3 收尾时我会固定记三个量化指标我自己的习惯是实验报告最后只留三个数字导入总行数、目标表 Region 数、导入耗时。理由很简单这三个数字能证明场景真实、数据完整、且分布方式有效。比如同一份数据预分区为 4 个 Region 时导入耗时明显低于单 Region这个对比比任何文字都值钱。另外我会把 WAL 对比实验的结论放在最后一页开启 WAL 时 kill -9 后数据可恢复关闭 WAL 后同样操作数据丢失。这个血泪教训让我后来在任何生产方案里都不敢随手关 WAL也建议你在自己的报告里保留同样记录。希望帮到你。本文还有配套的精品资源点击获取
