HBase命令
HBase Shell 核心命令:建表、查数据、删数据,一套命令全搞定
HBase Shell 是管理 HBase 最直接的工具——建表、改结构、查数据、删数据、看统计,都在这里。
这套命令分四类:
| 类别 | 管什么 |
|---|---|
| 表管理 | 创建、修改、删除表结构 |
| 数据读写 | 插入、查询、扫描数据 |
| 数据删除 | 删列、删行、删表 |
| 高级功能 | 原子计数器 |
表结构管理:建表、改表、删表
1. 建表(create)——什么时候用? 新业务要存数据了,先建表。
建一张表,至少指定一个列族
create 'user_info', 'info', 'log'
建表时指定列族属性(比如保留 5 个版本)
create 'user_info', {NAME => 'info', VERSIONS => 5}
注意:列族是建表时必须定的,一旦建好改起来麻烦。 建表前想清楚有哪些列族。
2. 看表列表(list)——什么时候用? 忘了表名叫什么、想看看集群里有哪些表。
list
list 'user.*' # 模糊匹配
3. 看表结构(describe)——什么时候用? 忘了这个表有哪些列族、每个列族的版本数设了多少。
describe 'user_info'
输出里能看到列族名、版本数、TTL、压缩算法等。
4. 改表结构(alter)——什么时候用? 业务变了,需要加新列族、删旧列族、改版本数。
加列族
alter 'user_info', NAME => 'new_family'
删列族
alter 'user_info', NAME => 'old_family', METHOD => 'delete'
改版本数
alter 'user_info', NAME => 'info', VERSIONS => 5
删除列族前要确认该列族下没有业务在用的数据。 列族删了,数据就没了。
5. 删表(drop)——什么时候用? 表不要了,清理数据。
disable 'user_info' # 删表前必须先禁用
drop 'user_info'
顺序:先 disable,再 drop。 直接 drop 会报错。
数据读写:插入、查询、扫描
1. 插入数据(put)——什么时候用? 写一条数据,指定 RowKey + 列族:列 + 值。
put 'user_info', 'user_001', 'info:name', '张三'
put 'user_info', 'user_001', 'info:age', '25'
put 'user_info', 'user_001', 'log:login', '2024-01-15 08:00'
同一个 RowKey 下,不同列族、不同列可以分开写入,不用一次性写全。
2. 查单行(get)——什么时候用? 知道 RowKey,想查这行数据。
查整行
get 'user_info', 'user_001'
只查某个列族
get 'user_info', 'user_001', 'info'
只查某个列
get 'user_info', 'user_001', 'info:name'
get 很快,因为 HBase 按 RowKey 索引。
3. 批量扫描(scan)——什么时候用? 不知道具体 RowKey,想按范围查一批数据。
扫全表(慎用,数据量大会很慢)
scan 'user_info'
扫指定列
scan 'user_info', {COLUMNS => 'info:name'}
按 RowKey 范围扫(左闭右开)
scan 'user_info', {STARTROW => 'user_001', STOPROW => 'user_100'}
限制返回行数
scan 'user_info', {LIMIT => 10}
scan 是范围查询,如果表很大又没有 RowKey 范围限制,会扫全表,耗时很长。
4. 统计行数(count)——什么时候用? 想知道这张表有多少行数据。
count 'user_info'
count 也是全表扫描,大表上执行会很久。 生产环境谨慎使用。
数据删除:删列、删行、删表
1. 删一列(delete)——什么时候用? 某条记录的某个字段错了,要删掉(不是更新)。
delete 'user_info', 'user_001', 'info:age'
delete 只删最新版本。 如果有多版本历史,旧版本还在。
2. 删整行(deleteall)——什么时候用? 这条记录不要了,整行清掉。
deleteall 'user_info', 'user_001'
删的是整行所有列族、所有列、所有版本的数据。 操作不可逆。
3. 删表(drop)——前面讲过了,先 disable 再 drop。
高级功能:原子计数器(incr)
什么时候用? 需要原子性累加——曝光量、点击量、库存扣减——不能有并发冲突。
建一张计数器表
create 'counters', 'camp'
累加 +1(原子操作)
incr 'counters', 'did123456', 'camp:501', 1
累加 +5
incr 'counters', 'did123456', 'camp:501', 5
查看当前计数
get_counter 'counters', 'did123456', 'camp:501'
输出:COUNTER VALUE = 6
incr 是原子操作,多个客户端同时累加同一个计数器不会乱。 这是 HBase 为数不多的原子操作之一。
日常工作流程示例
新业务上线,建表:
create 'user_profile', 'base', 'ext', 'log'
查一下表结构对不对:
describe 'user_profile'
写入测试数据:
put 'user_profile', 'u1001', 'base:name', '测试用户'
put 'user_profile', 'u1001', 'base:age', '25'
查一下写进去了没有:
get 'user_profile', 'u1001'
跑一批测试数据后,扫一下看看:
scan 'user_profile', {LIMIT => 10}
版本数不够,改一下:
alter 'user_profile', NAME => 'base', VERSIONS => 5
表不要了,删掉:
disable 'user_profile'
drop 'user_profile'