在HBase shell中,能夠使用status, version和whoami分別得到當前服務的狀態、版本、登陸用戶和驗證方式。web
> status servers, 1 dead, 1.3333 average load> version.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:.*'
在HBase系統中,命名空間namespace指的是一個HBase表的邏輯分組,同一個命名空間中的表有相似的用途,也用於配額和權限等設置進行安全管控。
HBase默認定義了兩個系統內置的預約義命名空間:
• hbase:系統命名空間,用於包含hbase的內部表
• default:全部未指定命名空間的表都自動進入該命名空間
咱們能夠經過create_namespace命令來創建命名空間shell
> create_namespace 'debugo_ns' row(s) in 2.0910 seconds
經過drop_namespace來刪除命名空間express
> drop_namespace 'debugo_ns' row(s) in 1.9540 seconds
經過alter_namespac改變表的屬性,其格式以下:alter_namespace 'my_ns', {METHOD => 'set', 'PROPERTY_NAME' => 'PROPERTY_VALUE'}
顯示命名空間以及設定的元信息:apache
> describe_namespace 'debugo_ns'DESCRIPTION {NAME => 'debugo_ns'} row(s) in 1.9540 seconds
顯示全部命名空間緩存
> list_namespace NAMESPACE debugo_ns default hbase row(s) in 0.0910 seconds
在HBase下建表須要使用create table_name, column_family1, 這個命令:安全
> create 'user','info' row(s) in 0.9030 seconds=> Hbase::Table - user
這個時候這個表是建立在default下面。若是須要在debugo_ns這個命名空間下面建表,則須要使用create namespace:table_name這種方式:函數
> create_namespace 'debugo_ns' row(s) in 2.0910 seconds create 'debugo_ns:users', 'info' row(s) in 0.4640 seconds=> Hbase::Table - debugo_ns:users
List命令能夠列出當前HBase實例中的全部表,支持使用正則表達式來匹配。工具
> list_namespace_tables 'debugo_ns'TABLE users row(s) in 0.0400 seconds
使用list_namespace_tables也能夠直接輸出某個命名空間下的全部表oop
> list_namespace_tables 'debugo_ns'TABLE users row(s) in 0.0400 seconds
首先是創建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'} row(s) in 0.0690 seconds
經過enable和disable來啓用/禁用這個表,相應的能夠經過is_enabled和is_disabled來檢查表是否被禁用。
> disable 't2' row(s) in 1.4410 seconds> enable 't2' row(s) in 0.5940 seconds> is_enabled 't2'true row(s) in 0.0400 seconds hbase(main):042:0> is_disabled 't2'false row(s) in 0.0490 seconds
使用exists來檢查表是否存在
> exists 't2'Table t2 does exist row(s) in 0.0590 seconds
使用alter來改變表的屬性,好比改變列簇的屬性, 這涉及將信息更新到全部的region。在過去的版本中,alter操做須要先把table禁用,而在當前版本已經不須要。
> alter 't1', {NAME => 'f1', VERSIONS => 5}Updating all regions with the new schema.../1 regions updated./1 regions updated.Done. row(s) in 2.3470 seconds
另一個很是經常使用的操做是添加和刪除列簇:
> alter 't1','f3'Updating all regions with the new schema.../1 regions updated./1 regions updated.Done. row(s) in 2.3130 seconds> alter 't1', 'delete' => 'f3'
或者:
> alter 't1',{ NAME => 'f3', METHOD => 'delete'}Updating all regions with the new schema.../1 regions updated./1 regions updated.Done. row(s) in 2.2930 seconds
刪除表須要先將表disable。
> disable 't1' row(s) in 1.4310 seconds> drop 't1' row(s) in 0.2440 seconds
在HBase shell中,咱們能夠經過put命令來插入數據。例如咱們新建立一個表,它擁有id、address和info三個列簇,並插入一些數據。列簇下的列不須要提早建立,在須要時經過
:
來指定便可。
> create 'member','id','address','info' 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 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 row(s) in 0.0320 seconds> get 'member', 'Sariel', 'info:age'COLUMN CELL info:age timestamp=1425871035225, value=26 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.../1 regions updated./1 regions updated.Done. 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 row(s) in 0.0400 seconds
經過delete命令,咱們能夠刪除id爲某個值的‘info:age’字段,接下來的get就無視了
> delete 'member','debugo','info:age' row(s) in 0.0420 seconds> get 'member','debugo','info:age'COLUMN CELL row(s) in 0.3270 seconds
經過deleteall來刪除整行
> delete 'member','debugo','info:age' row(s) in 0.0420 seconds> get 'member','debugo','info:age'COLUMN CELL row(s) in 0.3270 seconds
給’Sariel’的’info:age’字段添加,並使用incr實現遞增。但須要注意的是,這個value須要是一個數值,若是使用單引號標識的字符串就沒法使用incr。在使用Java API開發時,咱們能夠使用toBytes函數講數值轉換成byte字節。在HBase shell中咱們只能經過incr來初始化這個列,
> delete 'member','Sariel','info:age' row(s) in 0.0270 seconds> incr 'member','Sariel','info:age',26 row(s) in 0.0290 seconds> incr 'member','Sariel','info:age' row(s) in 0.0290 seconds> incr 'member','Sariel','info:age', -1 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 row(s) in 0.0280 seconds
十六進制1A是26,經過上面增1再減1後獲得的結果。下面經過count統計行數。
> count 'member' 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... row(s) in 2.3260 seconds
經過scan來對全表進行掃描。咱們將以前put的數據恢復。
> 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 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 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 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 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 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 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 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 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 …… row(s) in 0.0460 seconds