本文轉自http://debugo.com/hbase-shell-cmds/,感謝作者
HBase Shell是HBase的一個命令行工具,我們可以通過它對HBase進行維護操作。我們可以使用sudo -u hbase hbase shell來進入HBase shell。
在HBase shell中,可以使用status, version和whoami分別獲得當前服務的狀態、版本、登錄用戶和驗證方式。
| > status 3 servers, 1 dead, 1.3333 average load > version 0.98.6-cdh5.3.1, rUnknown, Tue Jan 27 16:43:50 PST 2015 > whoami hbase (auth:SIMPLE) groups: hbase |
HBase shell中的幫助命令非常強大,使用help獲得全部命令的列表,使用help ‘command_name’獲得某一個命令的詳細信息。 例如:
|
>
help
'list'
List
all
tables
in
hbase.
Optional
regular
expression
parameter
could
be
used
to
filter
the
output.
Examples:
hbase>
list
hbase>
list
'abc.*'
hbase>
list
'ns:abc.*'
hbase>
list
'ns:.*'
|
1. 命名空間
在HBase系統中,命名空間namespace指的是一個HBase表的邏輯分組,同一個命名空間中的表有類似的用途,也用於配額和權限等設置進行安全管控。
HBase默認定義了兩個系統內置的預定義命名空間:
• hbase:系統命名空間,用於包含hbase的內部表
• default:所有未指定命名空間的表都自動進入該命名空間
我們可以通過create_namespace命令來建立命名空間
| > create_namespace 'debugo_ns' 0 row(s) in 2.0910 seconds |
通過drop_namespace來刪除命名空間
|
>
drop_namespace
'debugo_ns'
0
row(s)
in
1.9540
seconds
|
通過alter_namespac改變表的屬性,其格式如下:
alter_namespace
'my_ns', {METHOD => 'set', 'PROPERTY_NAME' => 'PROPERTY_VALUE'}
顯示命名空間以及設定的元信息:
| > describe_namespace 'debugo_ns' DESCRIPTION {NAME => 'debugo_ns'} 1 row(s) in 1.9540 seconds |
顯示所有命名空間
|
>
list_namespace
NAMESPACE
debugo_ns
default
hbase
3
row(s)
in
0.0910
seconds
|
在HBase下建表需要使用create table_name, column_family1, 這個命令:
| > create 'user','info' 0 row(s) in 0.9030 seconds => Hbase::Table - user |
這個時候這個表是創建在default下面。如果需要在debugo_ns這個命名空間下面建表,則需要使用create namespace:table_name這種方式:
|
>
create_namespace
'debugo_ns'
0
row(s)
in
2.0910
seconds
create
'debugo_ns:users',
'info'
0
row(s)
in
0.4640
seconds
=>
Hbase::Table
-
debugo_ns:users
|
List命令可以列出當前HBase實例中的所有表,支持使用正則表達式來匹配。
| > list_namespace_tables 'debugo_ns' TABLE users 1 row(s) in 0.0400 seconds |
使用list_namespace_tables也可以直接輸出某個命名空間下的所有表
|
>
list_namespace_tables
'debugo_ns'
TABLE
users
1
row(s)
in
0.0400
seconds
|
2. DDL語句
首先是建立HBase表,上面我們已經用過create命令了。它後面的第一個參數是表名,然後是一系列列簇的列表。每個列簇中可以獨立指定它使用的版本數,數據有效保存時間(TTL),是否開啓塊緩存等信息。
| > create 't1', {NAME => 'f1', VERSIONS => 1, TTL => 2592000, BLOCKCACHE => true}, 'f2' |
表也可以在創建時指定它預分割(pre-splitting)的region數和split方法。在表初始建立時,HBase只分配給這個表一個region。這就意味着當我們訪問這個表數據時,我們只會訪問一個region server,這樣就不能充分利用集羣資源。HBase提供了一個工具來管理表的region數,即org.apache.hadoop.hbase.util.RegionSplitter和HBase shell中create中的split的配置項。例如:
|
>
create
't2',
'f1',
{NUMREGIONS
=>
3,
SPLITALGO
=>
'HexStringSplit'}
|
我們通過describe 來查看這個表中的元信息:
| > describe 't2' DESCRIPTION ENABLED 't2', {NAME => 'f1', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLIC true ATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMOR Y => 'false', BLOCKCACHE => 'true'} 1 row(s) in 0.0690 seconds |
通過enable和disable來啓用/禁用這個表,相應的可以通過is_enabled和is_disabled來檢查表是否被禁用。
|
>
disable
't2'
0
row(s)
in
1.4410
seconds
>
enable
't2'
0
row(s)
in
0.5940
seconds
>
is_enabled
't2'
true
0
row(s)
in
0.0400
seconds
hbase(main):042:0>
is_disabled
't2'
false
0
row(s)
in
0.0490
seconds
|
使用exists來檢查表是否存在
| > exists 't2' Table t2 does exist 0 row(s) in 0.0590 seconds |
使用alter來改變表的屬性,比如改變列簇的屬性, 這涉及將信息更新到所有的region。在過去的版本中,alter操作需要先把table禁用,而在當前版本已經不需要。
|
>
alter
't1',
{NAME
=>
'f1',
VERSIONS
=>
5}
Updating
all
regions
with
the
new
schema...
0/1
regions
updated.
1/1
regions
updated.
Done.
0
row(s)
in
2.3470
seconds
|
另外一個非常常用的操作是添加和刪除列簇:
| > alter 't1','f3' Updating all regions with the new schema... 0/1 regions updated. 1/1 regions updated. Done. 0 row(s) in 2.3130 seconds > alter 't1', 'delete' => 'f3' |
或者:
|
>
alter
't1',{
NAME
=>
'f3',
METHOD
=>
'delete'}
Updating
all
regions
with
the
new
schema...
0/1
regions
updated.
1/1
regions
updated.
Done.
0
row(s)
in
2.2930
seconds
|
刪除表需要先將表disable。
| > disable 't1' 0 row(s) in 1.4310 seconds > drop 't1' 0 row(s) in 0.2440 seconds |
3. put與get
在HBase shell中,我們可以通過put命令來插入數據。例如我們新創建一個表,它擁有id、address和info三個列簇,並插入一些數據。列簇下的列不需要提前創建,在需要時通過
:
來指定即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
>
create
'member','id','address','info'
0
row(s)
in
0.4570
seconds
=>
Hbase::Table
–
member
put
'member',
'debugo','id','11'
put
'member',
'debugo','info:age','27'
put
'member',
'debugo','info:birthday','1987-04-04'
put
'member',
'debugo','info:industry',
'it'
put
'member',
'debugo','address:city','beijing'
put
'member',
'debugo','address:country','china'
put
'member',
'Sariel',
'id',
'21'
put
'member',
'Sariel','info:age',
'26'
put
'member',
'Sariel','info:birthday',
'1988-05-09
'
put
'member',
'Sariel','info:industry',
'it'
put
'member',
'Sariel','address:city',
'beijing'
put
'member',
'Sariel','address:country',
'china'
put
'member',
'Elvis',
'id',
'22'
put
'member',
'Elvis','info:age',
'26'
put
'member',
'Elvis','info:birthday',
'1988-09-14
'
put
'member',
'Elvis','info:industry',
'it'
put
'member',
'Elvis','address:city',
'beijing'
put
'member',
'Elvis','address:country',
'china'
|
獲取一個id的所有數據
| > get 'member', 'Sariel' COLUMN CELL address:city timestamp=1425871035382, value=beijing address:country timestamp=1425871035424, value=china id: timestamp=1425871035176, value=21 info:age timestamp=1425871035225, value=26 info:birthday timestamp=1425871035296, value=1988-05-09 info:industry timestamp=1425871035334, value=it 6 row(s) in 0.0530 seconds |
獲得一個id,一個列簇(一個列)中的所有數據:
|
>
get
'member',
'Sariel',
'info'
COLUMN
CELL
info:age timestamp=1425871035225,
value=26
info:birthday
timestamp=1425871035296,
value=1988-05-09
info:industry
timestamp=1425871035334,
value=it
3
row(s)
in
0.0320
seconds
>
get
'member',
'Sariel',
'info:age'
COLUMN
CELL
info:age timestamp=1425871035225,
value=26
1
row(s)
in
0.0270
seconds
|
通過describe ‘member’可以看到,默認情況下列簇只保存1個version。我們先將其修改到2,然後update一些信息。
| > alter 'member', {NAME=> 'info', VERSIONS => 2} Updating all regions with the new schema... 0/1 regions updated. 1/1 regions updated. Done. 0 row(s) in 2.2580 seconds > put 'member', 'debugo','info:age','29' > put 'member', 'debugo','info:age','28' > get 'member', 'debugo', {COLUMN=>'info:age', VERSIONS=>2} COLUMN CELL info:age timestamp=1425884510241, value=28 info:age timestamp=1425884510195, value=29 2 row(s) in 0.0400 seconds |
4. 其他DML語句
通過delete命令,我們可以刪除id爲某個值的‘info:age’字段,接下來的get就無視了
|
>
delete
'member','debugo','info:age'
0
row(s)
in
0.0420
seconds
>
get
'member','debugo','info:age'
COLUMN
CELL
0
row(s)
in
0.3270
seconds
|
通過deleteall來刪除整行
| > delete 'member','debugo','info:age' 0 row(s) in 0.0420 seconds > get 'member','debugo','info:age' COLUMN CELL 0 row(s) in 0.3270 seconds |
給’Sariel’的’info:age’字段添加,並使用incr實現遞增。但需要注意的是,這個value需要是一個數值,如果使用單引號標識的字符串就無法使用incr。在使用Java API開發時,我們可以使用toBytes函數講數值轉換成byte字節。在HBase shell中我們只能通過incr來初始化這個列,
1
2
3
4
5
6
7
8
9
10
11
12
|
>
delete
'member','Sariel','info:age'
0
row(s)
in
0.0270
seconds
>
incr
'member','Sariel','info:age',26
0
row(s)
in
0.0290
seconds
>
incr
'member','Sariel','info:age'
0
row(s)
in
0.0290
seconds
>
incr
'member','Sariel','info:age',
-1
0
row(s)
in
0.0230
seconds
>
get
'member','Sariel','info:age'
COLUMN
CELL
info:age
timestamp=1425890213341,
value=\x00\x00\x00\x00\x00\x00\x00\x1A
1
row(s)
in
0.0280
seconds
|
十六進制1A是26,通過上面增1再減1後得到的結果。下面通過count統計行數。
| > count 'member' 2 row(s) in 0.0750 seconds => 2 |
通過truncate來截斷表。hbase是先將掉disable掉,然後drop掉後重建表來實現truncate的功能的。
|
hbase(main):010:0>
truncate
'member'
Truncating
'member'
table
(it
may
take
a
while):
-
Disabling
table...
-
Dropping
table...
-
Creating
table...
0
row(s)
in
2.3260
seconds
|
5. scan和filter
通過scan來對全表進行掃描。我們將之前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 33 | > scan 'member' ROW COLUMN+CELL Elvis column=address:city, timestamp=1425891057211, value= beijing Elvis column=address:country, timestamp=1425891057258, val ue=china Elvis column=id:, timestamp=1425891057038, value=22 Elvis column=info:age, timestamp=1425891057083, value=26 Elvis column=info:birthday, timestamp=1425891057129, value =1988-09-14 Elvis column=info:industry, timestamp=1425891057172, value =it Sariel column=address:city, timestamp=1425891056965, value= beijing Sariel column=address:country, timestamp=1425891057003, val ue=china Sariel column=id:, timestamp=1425891056767, value=21 Sariel column=info:age, timestamp=1425891056808, value=26 Sariel column=info:birthday, timestamp=1425891056883, value =1988-05-09 Sariel column=info:industry, timestamp=1425891056924, value =it debugo column=address:city, timestamp=1425891056642, value= beijing debugo column=address:country, timestamp=1425891056726, val ue=china debugo column=id:, timestamp=1425891056419, value=11 debugo column=info:age, timestamp=1425891056499, value=27 debugo column=info:birthday, timestamp=1425891056547, value =1987-04-04 debugo column=info:industry, timestamp=1425891056597, value =it 3 row(s) in 0.0660 seconds3 row(s) in 0.0590 seconds |
指定掃描其中的某個列:
|
>
scan
'member',
{COLUMNS=>
'info:birthday'}
|
或者整個列簇:
| > scan 'member', {COLUMNS=> 'info'} ROW COLUMN+CELL Elvis column=info:age, timestamp=1425891057083, value=26 Elvis column=info:birthday, timestamp=1425891057129, value=1988-09-14 Elvis column=info:industry, timestamp=1425891057172, value=it Sariel column=info:age, timestamp=1425891056808, value=26 Sariel column=info:birthday, timestamp=1425891056883, value=1988-05-09 Sariel column=info:industry, timestamp=1425891056924, value=it debugo column=info:age, timestamp=1425891056499, value=27 debugo column=info:birthday, timestamp=1425891056547, value=1987-04-04 debugo column=info:industry, timestamp=1425891056597, value=it 3 row(s) in 0.0650 seconds |
除了列(COLUMNS)修飾詞外,HBase還支持Limit(限制查詢結果行數),STARTROW (ROWKEY起始行。會先根據這個key定位到region,再向後掃描)、STOPROW(結束行)、TIMERANGE(限定時間戳範圍)、VERSIONS(版本數)、和FILTER(按條件過濾行)等。比如我們從Sariel這個rowkey開始,找下一個行的最新版本:
|
>
scan
'member',
{
STARTROW
=>
'Sariel',
LIMIT=>1,
VERSIONS=>1}
ROW COLUMN+CELL
Sariel
column=address:city,
timestamp=1425891056965,
value=beijing
Sariel
column=address:country,
timestamp=1425891057003,
value=china
Sariel
column=id:,
timestamp=1425891056767,
value=21
Sariel
column=info:age,
timestamp=1425891056808,
value=26
Sariel
column=info:birthday,
timestamp=1425891056883,
value=1988-05-09
Sariel
column=info:industry,
timestamp=1425891056924,
value=it
1
row(s)
in
0.0410
seconds
|
Filter是一個非常強大的修飾詞,可以設定一系列條件來進行過濾。比如我們要限制某個列的值等於26:
| > scan 'member', FILTER=>"ValueFilter(=,'binary:26')" ROW COLUMN+CELL Elvis column=info:age, timestamp=1425891057083, value=26 Sariel column=info:age, timestamp=1425891056808, value=26 2 row(s) in 0.0620 seconds |
值包含6這個值:
|
>
scan
'member',
FILTER=>"ValueFilter(=,'substring:6')"
Elvis column=info:age,
timestamp=1425891057083,
value=26
Sariel
column=info:age,
timestamp=1425891056808,
value=26
2
row(s)
in
0.0620
seconds
|
列名中的前綴爲birthday的:
| > scan 'member', FILTER=>"ColumnPrefixFilter('birth') " ROW COLUMN+CELL Elvis column=info:birthday, timestamp=1425891057129, value=1988-09-14 Sariel column=info:birthday, timestamp=1425891056883, value=1988-05-09 debugo column=info:birthday, timestamp=1425891056547, value=1987-04-04 3 row(s) in 0.0450 seconds |
FILTER中支持多個過濾條件通過括號、AND和OR的條件組合。
|
>
scan
'member',
FILTER=>"ColumnPrefixFilter('birth')
AND ValueFilter ValueFilter(=,'substring:1987')"
ROW
COLUMN+CELL
Debugo column=info:birthday,
timestamp=1425891056547,
value=1987-04-04
1
row(s)
in
0.0450
seconds
|
同一個rowkey的同一個column有多個version,根據timestamp來區分。而每一個列簇有多個column。而FIRSTKEYONLY僅取出每個列簇的第一個column的第一個版本。而KEYONLY則是對於每一個column只去取出key,把VALUE的信息丟棄,一般和其他filter結合使用。例如:
| > scan 'member', FILTER=>"FirstKeyOnlyFilter()" ROW COLUMN+CELL Elvis column=address:city, timestamp=1425891057211, value=beijing Sariel column=address:city, timestamp=1425891056965, value=beijing debugo column=address:city, timestamp=1425891056642, value=beijing 3 row(s) in 0.0230 seconds > scan 'member', FILTER=>"KeyOnlyFilter()" hbase(main):055:0> scan 'member', FILTER=>"KeyOnlyFilter()" ROW COLUMN+CELL Elvis column=address:city, timestamp=1425891057211, value= Elvis column=id:, timestamp=1425891057038, value= …… |
PrefixFilter是對Rowkey的前綴進行判斷,這是一個非常常用的功能。
|
>
scan
'member',
FILTER=>"PrefixFilter('E')"
ROW COLUMN+CELL
Elvis column=address:city,
timestamp=1425891057211,
value=beijing
……
1
row(s)
in
0.0460
seconds
|
^^