(轉)HBase 經常使用Shell命令

轉自:http://my.oschina.net/u/189445/blog/595232node

hbase shell命令                             描述 
alter 修改列族(column family)模式
count 統計表中行的數量
create 建立表
describe 顯示錶相關的詳細信息
delete 刪除指定對象的值(能夠爲表,行,列對應的值,另外也能夠指定時間戳的值)
deleteall 刪除指定行的全部元素值
disable 使表無效
drop 刪除表
enable 使表有效
exists 測試表是否存在
exit 退出hbase shell
get 獲取行或單元(cell)的值
incr 增長指定表,行或列的值
list 列出hbase中存在的全部表
put 向指向的表單元添加值
tools 列出hbase所支持的工具
scan 經過對錶的掃描來獲取對用的值
status 返回hbase集羣的狀態信息
shutdown 關閉hbase集羣(與exit不一樣)
truncate 從新建立指定表
version 返回hbase版本信息

要注意shutdown與exit之間的不一樣:shutdown表示關閉hbase服務,必須從新啓動hbase才能夠恢復,exit只是退出hbase shell,退出以後徹底能夠從新進入。算法

     hbase使用座標來定位表中的數據,行健是第一個座標,下一個座標是列族。shell

     hbase是一個在線系統,和hadoop mapreduce的緊密結合又賦予它離線訪問的功能。數據庫

     hbase接到命令後存下變化信息或者寫入失敗異常的拋出,默認狀況下。執行寫入時會寫到兩個地方:預寫式日誌(write-ahead log,也稱hlog)和memstore,以保證數據持久化memstore是內存裏的寫入緩衝區。客戶端在寫的過程當中不會與底層的hfile直接交互,當menstore寫滿時,會刷新到硬盤,生成一個新的hfile.hfile是hbase使用的底層存儲格式。menstore的大小由hbase-site.xml文件裏的系統級屬性hbase.hregion.memstore.flush.size來定義數組

      hbase在讀操做上使用了lru緩存機制(blockcache),blockcache設計用來保存從hfile裏讀入內存的頻繁訪問的數據,避免硬盤讀。每一個列族都有本身的blockcache。blockcache中的block是hbase從硬盤完成一次讀取的數據單位。block是創建索引的最小數據單位,也是從硬盤讀取的最小數據單位。若是主要用於隨機查詢,小一點的block會好一些,可是會致使索引變大,消耗更多內存,若是主要執行順序掃描,大一點的block會好一些,block變大索引項變小,所以節省內存。緩存

LRU是Least Recently Used 近期最少使用算法。內存管理的一種頁面置換算法,對於在內存中但又不用的數據塊(內存塊)叫作LRU,操做系統會根據哪些數據屬於LRU而將其移出內存而騰出空間來加載另外的數據。服務器

 

 數據模型歸納:網絡

表(table)---------hbase用表來組織數據。表名是字符串(string),由能夠在文件系統路徑裏使用的字符組成。ssh

行(row)---------在表裏,數據按行存儲。行由行健(rowkey)惟一標識。行健沒有數據類型,老是視爲字節數組byte[].jsp

列族(column family)-----------行裏的數據按照列族分組,列族也影響到hbase數據的物理存放。所以,它們必須事前定義而且不輕易修改。表中每行擁有相同列族,儘管行不須要在每一個列族裏存儲數據。列族名字是字符串,由能夠在文件系統路徑裏使用的字符組成。(HBase建表是能夠添加列族,alter 't1', {NAME => 'f1', VERSIONS => 5} 把表disable後alter,而後enable)

列限定符(column qualifier)--------列族裏的數據經過列限定符或列來定位。列限定符沒必要事前定義。列限定符沒必要在不一樣行之間保持一致,就像行健同樣,列限定符沒有數據類型,老是視爲字節數組byte[].

單元(cell)-------行健,列族和列限定符一塊兒肯定一個單元。存儲在單元裏的數據稱爲單元值(value),值也沒有數據類型,老是視爲字節數組byte[].

時間版本(version)--------單元值有時間版本,時間版本用時間戳標識,是一個long。沒有指定時間版本時,當前時間戳做爲操做的基本。hbase保留單元值時間版本的數量基於列族進行配置。默認數量是3個

   hbase在表裏存儲數據使用的是四維座標系統,依次是:行健,列族,列限定符和時間版本。 hbase按照時間戳降序排列各時間版本,其餘映射建按照升序排序。

   hbase把數據存放在一個提供單一命名空間的分佈式文件系統上。一張表由多個小一點的region組成,託管region的服務器叫作regionserver.單個region大小由配置參數hbase.hregion.max.filesize決定,當一個region大小變得大於該值時,會切分紅2個region.

   hbase是一種搭建在hadoop上的數據庫。依靠hadoop來實現數據訪問和數據可靠性。hbase是一種以低延遲爲目標的在線系統,而hadoop是一種爲吞吐量優化的離線系統。互補能夠搭建水平擴展的數據應用。

HBASE中的表示按column family來存儲的

創建一個有3個column family的表

create 't1', {NAME => 'f1', VERSIONS => 1}, {NAME => 'f2', VERSIONS => 1}, {NAME => 'f3', VERSIONS => 1}
定義表的時候只須要指定column family的名字,列名在put的時候動態指定
插入數據
下面插入沒有指定column的名字
put 't1', 'r1', 'f1', 'v1'
put 't1', 'r2', 'f2', 'v2'
put 't1', 'r3', 'f3', 'v3'

下面插入指定column的名字
put 't1', 'r4', 'f1:c1', 'v1'
put 't1', 'r5', 'f2:c2', 'v2'
put 't1', 'r6', 'f3:c3', 'v3'

hbase(main):245:0> scan 't1'
ROW COLUMN+CELL
r1 column=f1:, timestamp=1335407967324, value=v1
r2 column=f2:, timestamp=1335408004559, value=v2
r4 column=f1:c1, timestamp=1335408640777, value=v1
r5 column=f2:c1, timestamp=1335408640822, value=v2
r6 column=f1:c6, timestamp=1335412392258, value=v3
r6 column=f2:c1, timestamp=1335412384739, value=v3
r6 column=f2:c2, timestamp=1335412374797, value=v3

插入多列的數據
put 't1', 'r7', 'f1:c4', 'v9'
put 't1', 'r7', 'f2:c3', 'v9'
put 't1', 'r7', 'f3:c2', 'v9'

手工把memstore寫到Hfile中

flush 't1'

刪除全部CF3的數據
deleteall 't1','r7'

flush 't1'

每次flash都會建一個新的hfile

$ ../bin/hadoop dfs -lsr /hbase/t1

數據時直接存到CF目錄下的,每一個CF目錄下有3到4個Hfile

f1
f1/098a7a13fa53415b8ff7c73d4d69c869
f1/321c6211383f48dd91e058179486587e
f1/9722a9be0d604116882115153e2e86b3
f2
f2/43561825dbde4900af4fb388040c24dd
f2/93a20c69fdec43e8beeed31da8f87b8d
f2/b2b126443bbe4b6892fef3406d6f9597
f3
f3/98352b1b34e242ecac72f5efa8f66963
f3/e76ed1b564784799affa59fea349e00d
f3/f9448a9a381942e7b785e0983a66f006
f3/fca4c36e48934f2f9aaf1a585c237d44

f3都數據雖然都被刪除了,因爲沒有合併文件都存在

手工合併hfile

hbase(main):244:0> compact 't1'
0 row(s) in 0.0550 seconds

$ ../bin/hadoop dfs -lsr /hbase/t1
f1
f1/00c05ba881a14ca0bdea55ab509c2327
f2
f2/95fbe85769d64fc4b291cabe73b1ddb2

/f3

f1和f2下就只有一個hfile,f3下面沒有hfile由於數據都被刪除了

一次只能put一個column
一次只能delete一個column
刪除整行,用deleteall
deleteall 't1', 'r1'



     hbase表設計:

   hbase表很靈活,能夠用字符數組形式存儲任何東西。在同一列族裏存儲類似訪問模式的全部東西。

    索引創建在keyvalue對象的key部分上,key由行健,列限定符和時間戳按次序組成。高表可能支持你把運算複雜度降到o(1),可是要在原子性上付出代價。

    hbase不支持跨行事務,列限定符能夠用來存儲數據,列族名字的長度影響了經過網絡傳回客戶端的數據大小(在keyvalue對象裏),因此儘可能簡練。

    散列支持定長鍵和更好的數據分佈,可是失去排序的好處。設計hbase模式時進行反規範化處理是一種可行的辦法。從性能觀點看,規範化爲寫作優化,而反規範化爲讀作優化。

 

 

進入hbase shell console
$HBASE_HOME/bin/hbase shell
若是有kerberos認證,須要事先使用相應的keytab進行一下認證(使用kinit命令),認證成功以後再使用hbase shell進入可使用whoami命令可查看當前用戶

hbase(main)> whoami

 

表的管理
1)經過list能夠列出全部已建立的表(除-ROOT表和.META表(被過濾掉了))

hbase(main)> list

2)建立表,其中t1是表名,f一、f2是t1的列族。hbase中的表至少有一個列族.它們之中,列族直接影響hbase數據存儲的物理特性。

# 語法:create <table>, {NAME => <family>, VERSIONS => <VERSIONS>}
# 例如:建立表t1,有兩個family name:f1,f2,且版本數均爲2

hbase(main)> create 't1',{NAME => 'f1', VERSIONS => 2},{NAME => 'f2', VERSIONS => 2}

 

3)刪除表
分兩步:首先disable,而後drop
例如:刪除表t1
hbase(main)> disable 't1'

hbase(main)> drop 't1'

 

 

4)查看錶的結構 
# 語法:describe(desc) <table> (能夠看到這個表的全部默認參數)
# 例如:查看錶t1的結構

hbase(main)> describe 't1' / desc  't1'

 

5)修改表結構
修改表結構必須先disable

# 語法:alter 't1', {NAME => 'f1'}, {NAME => 'f2', METHOD => 'delete'}
# 例如:修改表test1的cf的TTL爲180天
hbase(main)> disable 'test1'
hbase(main)> alter 'test1',{NAME=>'body',TTL=>'15552000'},{NAME=>'meta', TTL=>'15552000'}

hbase(main)> enable 'test1'

 

權限管理

1)分配權限

# 語法 : grant <user> <permissions> <table> <column family> <column qualifier> 參數後面用逗號分隔

# 權限用五個字母表示: "RWXCA".

# READ('R'), WRITE('W'), EXEC('X'), CREATE('C'), ADMIN('A')
# 例如,給用戶‘test'分配對錶t1有讀寫的權限,
hbase(main)> grant 'test','RW','t1'
2)查看權限


# 語法:user_permission <table>
# 例如,查看錶t1的權限列表
hbase(main)> user_permission 't1'
3)收回權限


# 與分配權限相似,語法:revoke <user> <table> <column family> <column qualifier>
# 例如,收回test用戶在表t1上的權限
hbase(main)> revoke 'test','t1'
表數據的增刪改查
1)添加數據
# 語法:put <table>,<rowkey>,<family:column>,<value>,<timestamp>
# 例如:給表t1的添加一行記錄:rowkey是rowkey001,family name:f1,column name:col1,value:value01,timestamp:系統默認

hbase(main)> put 't1','rowkey001','f1:col1','value01'

 

用法比較單一。
2)查詢數據
a)查詢某行記錄

# 語法:get <table>,<rowkey>,[<family:column>,....]
# 例如:查詢表t1,rowkey001中的f1下的col1的值
hbase(main)> get 't1','rowkey001', 'f1:col1'
# 或者:
hbase(main)> get 't1','rowkey001', {COLUMN=>'f1:col1'}
# 查詢表t1,rowke002中的f1下的全部列值

hbase(main)> get 't1','rowkey001'

 

b)掃描表


# 語法:scan <table>, {COLUMNS => [ <family:column>,.... ], LIMIT => num}
# 另外,還能夠添加STARTROW、TIMERANGE和FITLER等高級功能
# 例如:掃描表t1的前5條數據
hbase(main)> scan 't1',{LIMIT=>5}

 

c)查詢表中的數據行數# 語法:count <table>, {INTERVAL => intervalNum, CACHE => cacheNum}# INTERVAL設置多少行顯示一次及對應的rowkey,默認1000;CACHE每次去取的緩存區大小,默認是10,調整該參數可提升查詢速度# 例如,查詢表t1中的行數,每100條顯示一次,緩存區爲500hbase(main)> count 't1', {INTERVAL => 100, CACHE => 500}3)刪除數據a )刪除行中的某個列值# 語法:delete <table>, <rowkey>,  <family:column> , <timestamp>,必須指定列名# 例如:刪除表t1,rowkey001中的f1:col1的數據hbase(main)> delete 't1','rowkey001','f1:col1'注:將刪除改行f1:col1列全部版本的數據b )刪除行# 語法:deleteall <table>, <rowkey>,  <family:column> , <timestamp>,能夠不指定列名,刪除整行數據# 例如:刪除表t1,rowk001的數據hbase(main)> deleteall 't1','rowkey001'c)刪除表中的全部數據# 語法: truncate <table># 其具體過程是:disable table -> drop table -> create table# 例如:刪除表t1的全部數據hbase(main)> truncate 't1'Region管理1)移動region# 語法:move 'encodeRegionName', 'ServerName'# encodeRegionName指的regioName後面的編碼,ServerName指的是master-status的Region Servers列表# 示例hbase(main)>move '4343995a58be8e5bbc739af1e91cd72d', 'db-41.xxx.xxx.org,60020,1390274516739'2)開啓/關閉region# 語法:balance_switch true|falsehbase(main)> balance_switch3)手動split# 語法:split 'regionName', 'splitKey'4)手動觸發major compaction#語法:#Compact all regions in a table:#hbase> major_compact 't1'#Compact an entire region:#hbase> major_compact 'r1'#Compact a single column family within a region:#hbase> major_compact 'r1', 'c1'#Compact a single column family within a table:#hbase> major_compact 't1', 'c1'配置管理及節點重啓1)修改hdfs配置hdfs配置位置:/etc/hadoop/conf# 同步hdfs配置cat /home/hadoop/slaves|xargs -i -t scp /etc/hadoop/conf/hdfs-site.xml hadoop@{}:/etc/hadoop/conf/hdfs-site.xml#關閉:cat /home/hadoop/slaves|xargs -i -t ssh hadoop@{} "sudo /home/hadoop/cdh4/hadoop-2.0.0-cdh4.2.1/sbin/hadoop-daemon.sh --config /etc/hadoop/conf stop datanode"#啓動:cat /home/hadoop/slaves|xargs -i -t ssh hadoop@{} "sudo /home/hadoop/cdh4/hadoop-2.0.0-cdh4.2.1/sbin/hadoop-daemon.sh --config /etc/hadoop/conf start datanode"2)修改hbase配置hbase配置位置:# 同步hbase配置cat /home/hadoop/hbase/conf/regionservers|xargs -i -t scp /home/hadoop/hbase/conf/hbase-site.xml hadoop@{}:/home/hadoop/hbase/conf/hbase-site.xml # graceful重啓cd ~/hbasebin/graceful_stop.sh --restart --reload --debug inspurXXX.xxx.xxx.org

相關文章
相關標籤/搜索