HBase 常用Shell命令


 

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


 

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使用坐標來定位表中的數據,行健是第一個坐標,下一個坐標是列族。

     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),由可以在文件系統路徑里使用的字符組成。

行(row)---------在表里,數據按行存儲。行由行健(rowkey)唯一標識。行健沒有數據類型,總是視為字節數組byte[].

列族(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是表名,f1、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條顯示一次,緩存區為500
hbase(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|false
hbase(main)> balance_switch
3)手動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 ~/hbase
bin/graceful_stop.sh --restart --reload --debug inspurXXX.xxx.xxx.org


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM