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'