1. 程式人生 > >轉: HBase 常用Shell命令

轉: HBase 常用Shell命令

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

 

兩個月前使用過hbase,現在最基本的命令都淡忘了,留一個備查~

 

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 [email protected]{}:/etc/hadoop/conf/hdfs-site.xml
#關閉:
cat /home/hadoop/slaves|xargs -i -t ssh [email protected]{} "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 [email protected]{} "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 [email protected]{}:/home/hadoop/hbase/conf/hbase-site.xml
 
# graceful重啟
cd ~/hbase
bin/graceful_stop.sh --restart --reload --debug inspurXXX.xxx.xxx.org