Fork me on GitHub

HBase Shell命令

进入与退出hbase shell命令行窗口

1
2
3
4
5
[root@repo ~]# hbase shell
hbase(main):001:0>
hbase(main):001:0> exit
[root@repo ~]#

help

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(1) 查看hbase中有哪些命令
hbase(main):015:0> help
...
COMMAND GROUPS:
Group name: general
Commands: status, table_help, version, whoami
Group name: ddl
Commands: alter, alter_async, alter_status, create, describe, disable, disable_all, drop, drop_all, enable, enable_all, exists, get_table, is_disabled, is_enabled, list, show_filters
Group name: namespace
Commands: alter_namespace, create_namespace, describe_namespace, drop_namespace, list_namespace, list_namespace_tables
Group name: dml
Commands: append, count, delete, deleteall, get, get_counter, incr, put, scan, truncate, truncate_preserve
(2) 查看某一组命令的下的所有命令的简介和简单示范
hbase(main):002:0> help 'ddl'
(3) 查看某个命令的详细使用
hbase(main):003:0> help 'create'

general组中命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
--(1) 查看集群状态
hbase(main):078:0> status
1 active master, 0 backup masters, 1 servers, 0 dead, 3.0000 average load
--(2) 查看集群版本
hbase(main):079:0> version
0.98.6-cdh5.3.6, rUnknown, Tue Jul 28 15:17:11 PDT 2015
--(3) 当前登录用户角色信息
hbase(main):080:0> whoami
root (auth:SIMPLE)
groups: root
--(4) 查看对某张表进行操作的基本命令
hbase(main):081:0> table_help

ddl组中命令

查看数据库中有哪些表

1
2
3
hbase(main):005:0> list
TABLE
person

建表

1
2
3
4
5
6
7
8
9
10
语法:create <table>, {NAME => <family>, VERSIONS => <VERSIONS>}
# create '表名', '列族1', '列族2'...
hbase(main):002:0> create 'person','cf1','cf2'
# 等价于
hbase(main):002:0> create 'person',{NAME=>'cf1' },{NAME=>'cf2'}
# 建表时可以指定表属性信息
# VERSIONS 当想要用HBase存储历史几个版本的数据是 (达到类似于git的效果时)可以设定版本号,版本号为几 就是存储几个版本的数据
hbase(main):005:0> create 'user_info',{NAME=>'base_info',VERSIONS=>3 },{NAME=>'extra_info',IN_MEMORY=>'true'}

alter 修改表

(1) 增加列族

1
2
3
4
5
6
7
8
9
10
11
alter 'table_name', 'add_family'
# 或者
alter 'table_name', {NAME => 'add_family'}
# 当然,新增加的列可以设置属性,比如
alter 'table_name', {NAME => 'add_family', VERSIONS => 3}
hbase(main):010:0> alter 'person','cf3'
Updating all regions with the new schema...
0/1 regions updated.
1/1 regions updated.

(2) 删除列族

1
2
3
alter 'table_name', {NAME => 'delete_family', METHOD => 'delete'}
或者
alter 'table_name', 'delete' => 'delete_family'

(3) 添加列族f1同时删除列族f2

1
alter 'user', {NAME => 'f1'}, {NAME => 'f2', METHOD => 'delete'}

(4) 修改列族

1
2
# 将user表的f1列族版本号改为5
alter 'user', NAME => 'f1', VERSIONS => 5

(5) 将 cf1 列族中的数据存放 3 个版本:

1
hbase(main):042:0> alter 'person',{NAME=>'cf1',VERSIONS=>3}

判断表是否存在exists

exists ‘table_name’

禁用表与启用表

1
2
3
4
5
6
7
8
--(1) 禁用表
disable 'table_name'
--(2) 查看表是否禁用
is_disabled 'table_name'
--(3) 启用表
enable 'table_name'
--(4) 查看表是否启用
is enabled 'table_name'

删除表disable&&drop

1
2
3
# hbase的某些版本,在删除表前,需要先禁用表
disable 'table_name'
drop 'table_name'

查看表属性信息desc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
hbase(main):007:0> describe 'person'
# 或者
hbase(main):007:0> desc 'person'
Table person is ENABLED
person
COLUMN FAMILIES DESCRIPTION
{
NAME => 'age',
BLOOMFILTER => 'ROW',
VERSIONS => '1',
IN_MEMORY => 'false',
KEEP_DELETED_CELLS => 'FALSE',
DATA_BLOCK_ENCODING => 'NONE',
TTL => 'FOREVER',
COMPRESSION => 'NONE',
MIN_VERSIONS => '0',
BLOCKCACHE => 'true',
BLOCKSIZE => '65536',
REPLICATION_SCOPE => '0'
}
# 其中的属性的意义:
NAME:列族名
VERSIONS:最大版本号
MIN_VERSIONS:最小版本号
TTL(Time To Live):存活时间
IN_MEMORY:是否开启缓存,默认false,应该开启,否则与BLOCKCACHE冲突
BLOCKCACHE:读缓存是否开启,默认开启,64M

dml组中命令

插入数据put

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
--(1) put '表名','rowkey','列族名:列名','值'
put 'person','0001','cf1:name','liucw'
put 'person','0001','cf1:sex','male'
put 'person','0001','cf1:age','18'
put 'person','0002','cf1:name','changwen'
put 'person','0002','cf1:sex','female'
put 'person','0002','cf1:age','20'
put 'person','0001','cf2:name','liucw'
put 'person','0001','cf2:sex','male'
put 'person','0001','cf2:age','18'
-- 统计表数据行数 注意:只有2行
hbase(main):033:0> count 'person'
2 row(s) in 0.0460 seconds
hbase(main):031:0> scan 'person'
ROW COLUMN+CELL
0001 column=cf1:age, timestamp=1551768727762, value=18
0001 column=cf1:name, timestamp=1551768650325, value=liucw
0001 column=cf1:sex, timestamp=1551768722507, value=male
0001 column=cf2:age, timestamp=1551768824538, value=18
0001 column=cf2:name, timestamp=1551768804735, value=liucw
0001 column=cf2:sex, timestamp=1551768819896, value=male
0002 column=cf1:age, timestamp=1551768767803, value=20
0002 column=cf1:name, timestamp=1551768750437, value=changwen
0002 column=cf1:sex, timestamp=1551768757424, value=female
2 row(s) in 0.0200 seconds
--(2) 可以指定时间戳,否则默认为系统当前时间
put 'person','0002','info:age',20,1482077777778

查询某行get

(1) 查看“指定行”

1
2
3
4
5
6
7
8
hbase(main):032:0> get 'person','0001'
COLUMN CELL
cf1:age timestamp=1551768727762, value=18
cf1:name timestamp=1551768650325, value=liucw
cf1:sex timestamp=1551768722507, value=male
cf2:age timestamp=1551768824538, value=18
cf2:name timestamp=1551768804735, value=liucw
cf2:sex timestamp=1551768819896, value=male

(2) 查看指定列族的消息

1
2
3
4
5
hbase(main):041:0> get 'person','0001','cf1'
COLUMN CELL
cf1:age timestamp=1551769193444, value=10
cf1:name timestamp=1551768650325, value=liucw
cf1:sex timestamp=1551768722507, value=male

(3) 查询某行,指定列名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
hbase(main):034:0> get 'person','0001','cf1:age'
COLUMN CELL
cf1:age timestamp=1551768727762, value=18
--(3) 查询某行,添加其他限制条件
# 查询person表中,rowkey为'0001'的这一行,只显示cf2:age这一列,并且只显示最新的3个版本
hbase(main):076:0> get 'person','0001',{COLUMNS=>'cf2:age',VERSIONS=>3}
COLUMN CELL
cf2:age timestamp=1551770366619, value=15
cf2:age timestamp=1551770364161, value=14
cf2:age timestamp=1551770361190, value=13
# 查看指定列的内容,并限定显示最新的3个版本和时间范围
get 'person', '0001', {COLUMN => 'cf1:age', VERSIONS => 3, TIMERANGE => [1392368783980, 1392380169184]}
# 查询person表中,rowkey为'rk0001',且某列的内容为'中国'的记录
hbase(main):041:0> put 'person','rk0001','cf1:age','70'
scan'person', 'rk0001', {FILTER => "ValueFilter(=, 'binary:中国')"}
# 查看指定行中 字段名称中含有 a的字段
get 'person’,’0001’,{FILTER=>”(QualifierFilter(=,’substring:a’))”}
# 返回字段的value值是指定的值的字段
get ‘person’,’0001’,{FILTER=>”ValueFilter(=,’binary:liucw’)”}

全表扫描scan

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
--(1) 扫描全表
scan 'person'
--(2) 扫描时指定列族
scan 'person', {COLUMNS => 'cf1'}
--(3) 扫描时指定列族,并限定显示最新的5个版本的内容
scan 'person', {COLUMNS => 'cf1', VERSIONS => 5}
--(4) 设置开启Raw模式,开启Raw模式会把那些已添加删除标记但是未实际删除的数据也显示出来
scan 'person', {COLUMNS => 'cf1', RAW => true}
--(5) 列的过滤
# 查询person表中列族为cf1和cf2的信息
scan 'person',{COLUMNS=>['cf1','cf2']}
# 查询person表中列族为cf1,列名为name、列族为cf2,列名为age的信息
scan 'person', {COLUMNS => ['cf1:name', 'cf2:age']}
# 查询person表中列族为cf1,列名为name的信息,并且版本最新的5个
scan 'person', {COLUMNS => 'cf1:name', VERSIONS => 5}
hbase(main):072:0> scan 'person',{COLUMNS=>'cf2:age',VERSIONS=>3}
ROW COLUMN+CELL
0001 column=cf2:age, timestamp=1551770366619, value=15
0001 column=cf2:age, timestamp=1551770364161, value=14
0001 column=cf2:age, timestamp=1551770361190, value=13
# 查询person表中列族为cf1和cf2且列名含有a字符的信息
scan 'person', {COLUMNS => ['cf1', 'cf2'], FILTER => "(QualifierFilter(=,'substring:a'))"}
# 查询person表中列族为cf1,rk范围是[rk0001, rk0003)的数据
scan 'people', {COLUMNS => 'cf1', STARTROW => 'rk0001', ENDROW => 'rk0003'}
# 查询person表中row key以rk字符开头的
scan 'person',{FILTER=>"PrefixFilter('rk')"}
# 查询person表中指定时间范围的数据
scan 'person', {TIMERANGE => [1392368783980, 1392380169184]}
scan的用法很多,参数,过滤条件可以很多,各种组合, 在此不列举过多的例子,参考 help 'scan'

删除数据

1
2
3
4
5
删除某 rowkey 的全部数据:
hbase(main) > deleteall 'student','1001'
删除某 rowkey 的某一列数据:
hbase(main) > delete 'student','1002','info:sex'

清空表

truncate 'table_name'


namespace

在HBase中,namespace命名空间指对一组表的逻辑分组,类似RDBMS中的database,方便对表在业务上划分。Apache HBase从0.98.0, 0.95.2两个版本开始支持namespace级别的授权操作,HBase全局管理员可以创建、修改和回收namespace的授权。

HBase系统默认定义了两个缺省的namespace
hbase:系统内建表,包括namespace和meta表
default:用户建表时未指定namespace的表都创建在此

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
创建namespace
hbase>create_namespace 'nametest'
删除namespace
hbase>drop_namespace 'nametest'
查看namespace
hbase>describe_namespace 'nametest'
列出所有namespace
hbase>list_namespace
在namespace下创建表
hbase>create 'nametest:testtable', 'fm1'
查看namespace下的表
hbase>list_namespace_tables 'nametest'


其他

1
2
3
4
5
6
7
8
9
--(1) 查看命名空间
hbase(main):015:0> list_namespace
NAMESPACE
default # 用户创建的表放在这里
hbase # 系统表空间
--(2) 把表中数据强制写到磁盘
flush 'table_name'
-----------------本文结束,感谢您的阅读-----------------