溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

HBase Shell常用操作有哪些

發(fā)布時間:2021-12-08 14:48:56 來源:億速云 閱讀:170 作者:小新 欄目:云計算

小編給大家分享一下HBase Shell常用操作有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

HBase Shell是HBase的一個命令行工具,我們可以通過它對HBase進(jìn)行維護(hù)操作。我們可以使用sudo -u hbase hbase shell來進(jìn)入HBase shell。
在HBase shell中,可以使用status, version和whoami分別獲得當(dāng)前服務(wù)的狀態(tài)、版本、登錄用戶和驗證方式。

> status
3 servers, 1 dead, 1.3333 average load
> version
0.98.6-cdh6.3.1, rUnknown, Tue Jan 27 16:43:50 PST 2015
> whoami
hbase (auth:SIMPLE)
groups: hbase

HBase shell中的幫助命令非常強(qiáng)大,使用help獲得全部命令的列表,使用help ‘command_name’獲得某一個命令的詳細(xì)信息。 例如:

> 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系統(tǒng)中,命名空間namespace指的是一個HBase表的邏輯分組,同一個命名空間中的表有類似的用途,也用于配額和權(quán)限等設(shè)置進(jìn)行安全管控。
HBase默認(rèn)定義了兩個系統(tǒng)內(nèi)置的預(yù)定義命名空間:
hbase:系統(tǒng)命名空間,用于包含hbase的內(nèi)部表
default:所有未指定命名空間的表都自動進(jìn)入該命名空間
我們可以通過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'}
顯示命名空間以及設(shè)定的元信息:

> 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

這個時候這個表是創(chuàng)建在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命令可以列出當(dāng)前HBase實例中的所有表,支持使用正則表達(dá)式來匹配。

> 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表,上面我們已經(jīng)用過create命令了。它后面的第一個參數(shù)是表名,然后是一系列列簇的列表。每個列簇中可以獨立指定它使用的版本數(shù),數(shù)據(jù)有效保存時間(TTL),是否開啟塊緩存等信息。

> create 't1', {NAME => 'f1', VERSIONS => 1, TTL => 2592000, BLOCKCACHE => true}, 'f2'

表也可以在創(chuàng)建時指定它預(yù)分割(pre-splitting)的region數(shù)和split方法。在表初始建立時,HBase只分配給這個表一個region。這就意味著當(dāng)我們訪問這個表數(shù)據(jù)時,我們只會訪問一個region server,這樣就不能充分利用集群資源。HBase提供了一個工具來管理表的region數(shù),即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來啟用/禁用這個表,相應(yīng)的可以通過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禁用,而在當(dāng)前版本已經(jīng)不需要。

> 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命令來插入數(shù)據(jù)。例如我們新創(chuàng)建一個表,它擁有id、address和info三個列簇,并插入一些數(shù)據(jù)。列簇下的列不需要提前創(chuàng)建,在需要時通過
:
來指定即可。

> 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的所有數(shù)據(jù)

> 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,一個列簇(一個列)中的所有數(shù)據(jù):

> 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’可以看到,默認(rèn)情況下列簇只保存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實現(xiàn)遞增。但需要注意的是,這個value需要是一個數(shù)值,如果使用單引號標(biāo)識的字符串就無法使用incr。在使用Java API開發(fā)時,我們可以使用toBytes函數(shù)講數(shù)值轉(zhuǎn)換成byte字節(jié)。在HBase shell中我們只能通過incr來初始化這個列,

> 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

十六進(jìn)制1A是26,通過上面增1再減1后得到的結(jié)果。下面通過count統(tǒng)計行數(shù)。

> count 'member'
2 row(s) in 0.0750 seconds
=> 2

通過truncate來截斷表。hbase是先將掉disable掉,然后drop掉后重建表來實現(xiàn)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來對全表進(jìn)行掃描。我們將之前put的數(shù)據(jù)恢復(fù)。

> 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(限制查詢結(jié)果行數(shù)),STARTROW (ROWKEY起始行。會先根據(jù)這個key定位到region,再向后掃描)、STOPROW(結(jié)束行)、TIMERANGE(限定時間戳范圍)、VERSIONS(版本數(shù))、和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是一個非常強(qiáng)大的修飾詞,可以設(shè)定一系列條件來進(jìn)行過濾。比如我們要限制某個列的值等于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,根據(jù)timestamp來區(qū)分。而每一個列簇有多個column。而FIRSTKEYONLY僅取出每個列簇的第一個column的第一個版本。而KEYONLY則是對于每一個column只去取出key,把VALUE的信息丟棄,一般和其他filter結(jié)合使用。例如:

> 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的前綴進(jìn)行判斷,這是一個非常常用的功能。

> scan 'member', FILTER=>"PrefixFilter('E')"
ROW    COLUMN+CELL                                                                                 
Elvis    column=address:city, timestamp=1425891057211, value=beijing                                 
……
1 row(s) in 0.0460 seconds

以上是“HBase Shell常用操作有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI