实验目标
- 掌握HBase命名空间的创建与管理
- 理解HBase表结构和列族设计
- 练习HBase数据的CRUD操作(增删改查)
- 掌握表结构修改和版本控制配置
- 学会使用扫描(scan)和获取(get)操作
实验步骤
HBase服务安装
1. 准备HBase环境
# 启动HBase Shell环境
hbase shell
# 检查集群状态(保留命令)
status
2. 创建命名空间
# TODO:创建名为"userapp_cust_ns"的命名空间
# 提示:
# 1. 使用create_namespace命令
# 2. 命名空间名称用单引号包裹
3. 创建数据表
# 保留:在默认命名空间创建系统监控表
create 'sysmon_userapp', 'metrics'
# TODO:在userapp_cust_ns命名空间中创建客户信息表
# 要求:
# - 表名:customer_info
# - 包含两个列族:personal_info和contact_info
操作命令
hbase(main):003:0> status
1 active master, 0 backup masters, 1 servers, 0 dead, 2.0000 average load
hbase(main):020:0* create_namespace 'userapp_cust_ns'
Took 0.3474 seconds
hbase(main):021:0> create 'sysmon_userapp', 'metrics'
Created table sysmon_userapp
Took 0.9248 seconds
=> Hbase::Table - sysmon_userapp
hbase(main):022:0> desc 'sysmon_userapp'
Table sysmon_userapp is ENABLED
sysmon_userapp
COLUMN FAMILIES DESCRIPTION
{NAME => 'metrics', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIO
R => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'false', DATA_BLOCK_EN
CODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFI
LTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRIT
E => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'tr
ue', BLOCKSIZE => '65536'}
1 row(s)
Took 0.2160 seconds
hbase(main):023:0>
hbase(main):024:0* create 'userapp_cust_ns:customer_info','personal_info','contact_info'
Created table userapp_cust_ns:customer_info
Took 1.2994 seconds
=> Hbase::Table - userapp_cust_ns:customer_info
4. 插入客户数据
# TODO:插入客户ID为'cust1'的数据
# 要求:
# 1. 姓名(Li Bai)保存到personal_info:name
# 2. 手机号(123-456-7890)保存到contact_info:phone
# 3. 地址(123 Main St...)保存到contact_info:address
# 4. 使用put命令,注意行键和列限定符格式
# TODO:插入客户cust2的数据
# 提示:使用put命令,指定完整表名(含命名空间)和行键
# 要求:
# 1. 姓名(Wang Wei)保存到personal_info:name
# 2. 手机号(098-765-4321)保存到contact_info:phone
hbase(main):014:0> put 'userapp_cust_ns:customer_info', 'cust1', 'personal_info:name', 'Li Bai'
Took 0.1149 seconds
hbase(main):015:0> put 'userapp_cust_ns:customer_info', 'cust1', 'contact_info:phone', '123-456-7890'
Took 0.0172 seconds
hbase(main):016:0> put 'userapp_cust_ns:customer_info', 'cust1', 'contact_info:address', '123 Main St...'
Took 0.0156 seconds
hbase(main):017:0> get 'userapp_cust_ns:customer_info', 'cust1'
COLUMN CELL
contact_info:address timestamp=1751854477618, value=123 Main St...
contact_info:phone timestamp=1751854473578, value=123-456-7890
personal_info:name timestamp=1751854473532, value=Li Bai
1 row(s)
Took 0.0785 seconds
hbase(main):018:0> put 'userapp_cust_ns:customer_info', 'cust2', 'personal_info:name', 'Wang Wei'
Took 0.0183 seconds
hbase(main):019:0> put 'userapp_cust_ns:customer_info', 'cust2', 'contact_info:phone', '098-765-4321'
Took 0.0082 seconds
hbase(main):020:0> get 'userapp_cust_ns:customer_info', 'cust2'
COLUMN CELL
contact_info:phone timestamp=1751854581470, value=098-765-4321
personal_info:name timestamp=1751854580165, value=Wang Wei
1 row(s)
Took 0.0130 seconds
5. 查询客户信息
# TODO:查询客户ID为'cust1'的所有信息
# 提示:使用get命令,指定完整表名(含命名空间)和行键
# 扫描全表
# 提示:使用scan命令,指定完整表名(含命名空间)
hbase(main):021:0> scan 'userapp_cust_ns:customer_info'
6. 更新客户数据
# TODO:更新cust1的手机号为111-222-3333
# 提示:
# 1. 使用put命令覆盖原有数据
# 2. 指定相同的行键和列限定符
put 'userapp_cust_ns:customer_info', 'cust1', 'contact_info:phone', '111-222-3333'
说明:
HBase的更新本质上是写入新版本的数据,旧版本数据仍然保留(根据版本设置保留)
默认情况下会保留1个版本,可以通过
describe
命令查看表的VERSIONS设置如果需要读取历史版本数据,可以使用:
get 'userapp_cust_ns:customer_info', 'cust1', {COLUMN => 'contact_info:phone', VERSIONS => 2}
当前列族版本配置
contact_info
列族:VERSIONS => '1'
personal_info
列族:VERSIONS => '1'
这表示:
每个单元格(cell)默认只保留最新1个版本的数据
当你更新数据时,旧版本会被新版本直接覆盖(无法回溯历史值)
如果需要查看多个历史版本(比如修改记录),需要修改列族的 VERSIONS
属性:
7. 修改表结构
# TODO:为表添加additional_info列族
# 要求:
# - 列族名称:additional_info
# - 保留3个版本数据
# 提示:使用alter命令和NAME/VERSIONS参数
# 首先禁用表(修改表结构前必须禁用)
disable 'userapp_cust_ns:customer_info'
# 添加新的列族,设置VERSIONS=3
alter 'userapp_cust_ns:customer_info', {NAME => 'additional_info', VERSIONS => 3}
# 重新启用表
enable 'userapp_cust_ns:customer_info'
8. 删除客户数据
# TODO:删除客户ID为'cust2'的所有数据
# 提示:使用deleteall命令,指定完整的表名和行键
9. 特殊操作处理
# TODO:解释truncate操作的功能及实现方法
# 要求:
# 1. 不直接提供truncate命令
# 2. 描述其作用相当于哪两个操作的组合(需要两个步骤)
# 3. 在下方空白处写出完整解决方案