HBase 常用Shell命令__hbase

來源:互聯網
上載者:User

轉自: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把資料存放在一個提供單一命名空間的Distributed File System上。一張表由多個小一點的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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.