HBase常用Shell命令详解
一、hbase數(shù)據(jù)模型介紹
hbase數(shù)據(jù)模型包括:
1.表(table)---------hbase用表來組織數(shù)據(jù)。表名是字符串(string),由可以在文件系統(tǒng)路徑里使用的字符組成。
2.行(row)---------在表里,數(shù)據(jù)按行存儲。行由行健(rowkey)唯一標(biāo)識。行健沒有數(shù)據(jù)類型,總是視為字節(jié)數(shù)組byte[].
3.列族(column family)-----------行里的數(shù)據(jù)按照列族分組,列族也影響到hbase數(shù)據(jù)的物理存放。因此,它們必須事前定義并且不輕易修改。表中每行擁有相同列族,盡管行不需要在每個(gè)列族里存儲數(shù)據(jù)。列族名字是字符串,由可以在文件系統(tǒng)路徑里使用的字符組成。(HBase建表是可以添加列族,alter 't1', {NAME => 'f1', VERSIONS => 5} 把表disable后alter,然后enable)
4.列限定符(column qualifier)--------列族里的數(shù)據(jù)通過列限定符或列來定位。列限定符不必事前定義。列限定符不必在不同行之間保持一致,就像行健一樣,列限定符沒有數(shù)據(jù)類型,總是視為字節(jié)數(shù)組byte[].
5.單元(cell)-------行健,列族和列限定符一起確定一個(gè)單元。存儲在單元里的數(shù)據(jù)稱為單元值(value),值也沒有數(shù)據(jù)類型,總是視為字節(jié)數(shù)組byte[].
6.時(shí)間版本(version)--------單元值有時(shí)間版本,時(shí)間版本用時(shí)間戳標(biāo)識,是一個(gè)long類型值。沒有指定時(shí)間版本時(shí),當(dāng)前時(shí)間戳作為操作的基本。hbase保留單元值時(shí)間版本的數(shù)量基于列族進(jìn)行配置。默認(rèn)數(shù)量是3個(gè)。
hbase在表里存儲數(shù)據(jù)使用的是四維坐標(biāo)系統(tǒng),依次是:行健、列族、列限定符和時(shí)間版本。?hbase按照時(shí)間戳降序排列各時(shí)間版本,其他映射建按照升序排序。
hbase把數(shù)據(jù)存放在一個(gè)提供單一命名空間的分布式文件系統(tǒng)上。一張表由多個(gè)小一點(diǎn)的region組成,托管region的服務(wù)器叫做region server。單個(gè)region大小由配置參數(shù)hbase.hregion.max.filesize決定,當(dāng)一個(gè)region大小變得大于該值時(shí),會(huì)切分成2個(gè)region。
hbase是一種搭建在hadoop上的數(shù)據(jù)庫,依靠hadoop來實(shí)現(xiàn)數(shù)據(jù)訪問和數(shù)據(jù)可靠性。hbase是一種以低延遲為目標(biāo)的在線系統(tǒng),而hadoop是一種為吞吐量優(yōu)化的離線系統(tǒng),兩者互補(bǔ)可以搭建水平擴(kuò)展的數(shù)據(jù)應(yīng)用。
hbase表設(shè)計(jì)原則:
(1)hbase表很靈活,可以用字符數(shù)組形式存儲任何東西。在同一列族里存儲相似訪問模式的所有東西。
(2)索引建立在key、value對象的key部分上,key由行健、列限定符和時(shí)間戳按次序組成。高表可能支持把運(yùn)算復(fù)雜度降到o(1),但是要在原子性上付出代價(jià)。
(3)hbase不支持跨行事務(wù),列限定符可以用來存儲數(shù)據(jù),列族名字的長度會(huì)影響通過網(wǎng)絡(luò)傳回客戶端的數(shù)據(jù)大小(在key、value對象里),所以盡量簡練。
(4)散列支持定長鍵和更好的數(shù)據(jù)分布,但是失去排序的好處。設(shè)計(jì)hbase模式時(shí),進(jìn)行反規(guī)范化處理是一種可行的辦法。從性能觀點(diǎn)看,規(guī)范化為寫做優(yōu)化,而反規(guī)范化為讀做優(yōu)化。
二、hbase常用命令列表
| hbase shell命令???????????? | ??????????????? 描述? |
| alter | 修改列族(column family)模式 |
| count | 統(tǒng)計(jì)表中行的數(shù)量 |
| create | 創(chuàng)建表 |
| describe | 顯示表相關(guān)的詳細(xì)信息 |
| delete | 刪除指定對象的值(可以為表,行,列對應(yīng)的值,另外也可以指定時(shí)間戳的值) |
| deleteall | 刪除指定行的所有元素值 |
| disable | 使表無效 |
| drop | 刪除表 |
| enable | 使表有效 |
| exists | 測試表是否存在 |
| exit | 退出hbase shell |
| get | 獲取行或單元(cell)的值 |
| incr | 增加指定表,行或列的值 |
| list | 列出hbase中存在的所有表 |
| put | 向指向的表單元添加值 |
| tools | 列出hbase所支持的工具 |
| scan | 通過對表的掃描來獲取對用的值 |
| status | 返回hbase集群的狀態(tài)信息 |
| shutdown | 關(guān)閉hbase集群(與exit不同) |
| truncate | 重新創(chuàng)建指定表 |
| version | 返回hbase版本信息 |
注意:shutdown與exit不同,shutdown表示關(guān)閉hbase服務(wù),必須重新啟動(dòng)hbase才可以恢復(fù);exit只是退出hbase shell,退出之后完全可以重新進(jìn)入。
hbase使用坐標(biāo)來定位表中的數(shù)據(jù),行鍵是第一個(gè)坐標(biāo),下一個(gè)坐標(biāo)是列族。
hbase是一個(gè)在線系統(tǒng),和hadoop mapreduce的緊密結(jié)合又賦予它離線訪問的功能。
hbase接到命令后,默認(rèn)情況下,存下變化信息或者寫入失敗異常的拋出。執(zhí)行寫入時(shí),會(huì)寫到兩個(gè)地方:預(yù)寫式日志(write-ahead log,也稱hlog)和memstore,以保證數(shù)據(jù)持久化。memstore是內(nèi)存里的寫入緩沖區(qū)。客戶端在寫的過程中不會(huì)與底層的hfile直接交互,當(dāng)menstore寫滿時(shí),會(huì)刷新到硬盤,生成一個(gè)新的hfile。hfile是hbase使用的底層存儲格式。menstore的大小由hbase-site.xml文件里的系統(tǒng)級屬性hbase.hregion.memstore.flush.size來定義。
hbase在讀操作上使用了lru緩存機(jī)制(block cache),block cache用于保存從hfile里讀入內(nèi)存的、頻繁訪問的數(shù)據(jù),避免硬盤讀。每個(gè)列族都有自己的block cache。block cache中的block是hbase從硬盤完成一次讀取的數(shù)據(jù)單位。block是建立索引的最小數(shù)據(jù)單位,也是從硬盤讀取的最小數(shù)據(jù)單位。如果主要用于隨機(jī)查詢,小一點(diǎn)的block會(huì)好一些,但是會(huì)導(dǎo)致索引變大,消耗更多內(nèi)存。如果主要執(zhí)行順序掃描,大一點(diǎn)的block會(huì)好一些,block變大使索引項(xiàng)變小,因此節(jié)省內(nèi)存。
LRU是Least Recently Used 近期最少使用算法,是內(nèi)存管理的一種頁面置換算法。對于在內(nèi)存中但又不用的數(shù)據(jù)塊(內(nèi)存塊),操作系統(tǒng)會(huì)根據(jù)哪些數(shù)據(jù)屬于LRU將其移出內(nèi)存,騰出空間來加載另外的數(shù)據(jù)。
三、hbase操作命令詳解
進(jìn)入hbase shell console
$HBASE_HOME/bin/hbase shell如果有kerberos認(rèn)證,需要事先使用相應(yīng)的keytab進(jìn)行認(rèn)證(使用kinit命令);認(rèn)證成功之后,再使用hbase shell進(jìn)入。可以使用whoami命令查看當(dāng)前用戶。
3.1 表的管理
1)查看表名列表,通過list命令,可以列出所有已創(chuàng)建的表(除-ROOT表和.META表(被過濾掉了))
hbase(main)> list?
2)創(chuàng)建表,其中t1是表名,f1、f2是t1的列族。hbase中的表至少有一個(gè)列族。它們之中,列族直接影響hbase數(shù)據(jù)存儲的物理特性。
# 語法:create <table>, {NAME => <family>, VERSIONS => <VERSIONS>}
# 例如:創(chuàng)建表t1,有兩個(gè)family name:f1,f2,且版本數(shù)均為2。
執(zhí)行結(jié)果:
3)刪除表
分兩步:首先disable表,然后drop表。
例如:刪除表t1。
執(zhí)行結(jié)果:
4)查看表的結(jié)構(gòu)?
# 語法:describe(desc) <table>?(可以看到這個(gè)表的所有默認(rèn)參數(shù))
# 例如:查看表t1的結(jié)構(gòu)
或者
hbase(main)> desc ?'t1'執(zhí)行結(jié)果:
5)修改表結(jié)構(gòu)
修改表結(jié)構(gòu),必須先disable表,再enable表。
# 語法:alter 't1', {NAME => 'f1'}, {NAME => 'f2', METHOD => 'delete'}
# 例如:修改表test1的cf的TTL為180天。
執(zhí)行結(jié)果:
3.2?權(quán)限管理
1)分配權(quán)限
# 語法 : grant <user> <permissions> <table> <column family> <column qualifier> 參數(shù)后面用逗號分隔
# 權(quán)限用五個(gè)字母表示: "RWXCA"。
#?READ('R'), WRITE('W'), EXEC('X'), CREATE('C'), ADMIN('A')
# 例如,給用戶‘test'分配對表t1有讀寫的權(quán)限。
2)查看權(quán)限
# 語法:user_permission <table>
# 例如,查看表t1的權(quán)限列表。
3)收回權(quán)限
# 與分配權(quán)限類似,語法:revoke <user> <table> <column family> <column qualifier>
# 例如,收回test用戶在表t1上的權(quán)限。
3.3 表數(shù)據(jù)的增刪改查
1)添加數(shù)據(jù)
# 語法:put <table>,<rowkey>,<family:column>,<value>,<timestamp>
# 例如:給表t1的添加一行記錄:rowkey是rowkey001,family name:f1,column name:col1,value:value01,timestamp:系統(tǒng)默認(rèn)。
執(zhí)行結(jié)果:
?2)查詢數(shù)據(jù)
a.查詢某行記錄
# 語法:get <table>,<rowkey>,[<family:column>,....]
# 例如:查詢表t1,rowkey001中的f1下的col1的值。
# 或者:
hbase(main)> get 't1','rowkey001', {COLUMN=>'f1:col1'}# 查詢表t1,rowke002中的f1下的所有列值。
hbase(main)>?get 't1','rowkey001'執(zhí)行結(jié)果:
b.?掃描表
# 語法:scan <table>, {COLUMNS => [ <family:column>,.... ], LIMIT => num}
# 另外,還可以添加STARTROW、TIMERANGE和FITLER等高級功能。
# 例如:掃描表t1的前5條數(shù)據(jù)。
執(zhí)行結(jié)果:
c. 查詢表中的數(shù)據(jù)行數(shù)
# 語法:count <table>, {INTERVAL => intervalNum, CACHE => cacheNum}
# INTERVAL設(shè)置多少行顯示一次對應(yīng)的rowkey,默認(rèn)1000;CACHE為每次去取的緩存區(qū)大小,默認(rèn)是10,調(diào)整該參數(shù)可提高查詢速度。
# 例如,查詢表t1中的行數(shù),每100條顯示一次,緩存區(qū)為500。
3)刪除數(shù)據(jù)
?a.?刪除行中的某個(gè)列值
# 語法:delete <table>, <rowkey>, ?<family:column> , <timestamp>,必須指定列名
# 例如:刪除表t1,rowkey001中的f1:col1的數(shù)據(jù)。
注:將刪除該行f1:col1列所有版本的數(shù)據(jù)。
b.?刪除行
# 語法:deleteall <table>, <rowkey>, ?<family:column> , <timestamp>,可以不指定列名,刪除整行數(shù)據(jù)
# 例如:刪除表t1,rowk001的數(shù)據(jù)。
c. 刪除表中的所有數(shù)據(jù)
# 語法: truncate <table>
# 其具體過程是:disable table -> drop table -> create table。
# 例如:刪除表t1的所有數(shù)據(jù)。
3.4 Region管理
1)移動(dòng)region
# 語法:move 'encodeRegionName', 'ServerName'
# encodeRegionName為regioName后面的編碼,ServerName為master-status的Region Servers列表。
# 示例
2)開啟/關(guān)閉region
# 語法:balance_switch true|false
3)手動(dòng)split
# 語法:split 'regionName', 'splitKey'
4)手動(dòng)觸發(fā)major compaction
#語法:
#Compact all regions in a table:
#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'3.5?配置管理及節(jié)點(diǎn)重啟
1)修改hdfs配置
hdfs配置位置:/etc/hadoop/conf
# 同步hdfs配置
#關(guān)閉:
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"#啟動(dòng):
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四、hbase操作命令示例
1.建立一個(gè)有3個(gè)column family的表
create 't1', {NAME => 'f1', VERSIONS => 1}, {NAME => 'f2', VERSIONS => 1}, {NAME => 'f3', VERSIONS => 1}定義表的時(shí)候,只需要指定column family的名字,列名在put的時(shí)候動(dòng)態(tài)指定。
2.插入數(shù)據(jù)
下面插入沒有指定column的family。
下面插入指定column的family。
put 't1', 'r4', 'f1:c1', 'v1' put 't1', 'r5', 'f2:c2', 'v2' put 't1', 'r6', 'f3:c3', 'v3'3.掃描表獲取數(shù)據(jù)
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
4.插入多列的數(shù)據(jù)
5.手工把memstore寫到hfile中
flush 't1'每次flash都會(huì)建一個(gè)新的hfile。
6.刪除所有CF3的數(shù)據(jù)
deleteall 't1','r7'再次刷新
flush 't1'通過hadoop命令查看hbase目錄
$ ../bin/hadoop dfs -lsr /hbase/t1數(shù)據(jù)是直接存到CF目錄下的,每個(gè)CF目錄下有3到4個(gè)Hfile。
查看結(jié)果為
f3數(shù)據(jù)雖然被刪除了,由于沒有合并文件,還依然存在。
注意:一次只能put一個(gè)column,一次只能delete一個(gè)column。刪除整行,使用deleteall命令。
deleteall 't1', 'r1'總結(jié)
以上是生活随笔為你收集整理的HBase常用Shell命令详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: libRTMP文档
- 下一篇: freeswitch被外国IP攻击盗打的