日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HBase常用Shell命令详解

發(fā)布時間:2023/12/31 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HBase常用Shell命令详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、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ù)的物理存放。因此,它們必須事前定義并且不輕易修改。表中每行擁有相同列族,盡管行不需要在每個列族里存儲數(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)-------行健,列族和列限定符一起確定一個單元。存儲在單元里的數(shù)據(jù)稱為單元值(value),值也沒有數(shù)據(jù)類型,總是視為字節(jié)數(shù)組byte[].

6.時間版本(version)--------單元值有時間版本,時間版本用時間戳標(biāo)識,是一個long類型值。沒有指定時間版本時,當(dāng)前時間戳作為操作的基本。hbase保留單元值時間版本的數(shù)量基于列族進(jìn)行配置。默認(rèn)數(shù)量是3個

hbase在表里存儲數(shù)據(jù)使用的是四維坐標(biāo)系統(tǒng),依次是:行健、列族、列限定符和時間版本。?hbase按照時間戳降序排列各時間版本,其他映射建按照升序排序。

hbase把數(shù)據(jù)存放在一個提供單一命名空間的分布式文件系統(tǒng)上。一張表由多個小一點的region組成,托管region的服務(wù)器叫做region server。單個region大小由配置參數(shù)hbase.hregion.max.filesize決定,當(dāng)一個region大小變得大于該值時,會切分成2個region。

hbase是一種搭建在hadoop上的數(shù)據(jù)庫,依靠hadoop來實現(xiàn)數(shù)據(jù)訪問和數(shù)據(jù)可靠性。hbase是一種以低延遲為目標(biāo)的在線系統(tǒng),而hadoop是一種為吞吐量優(yōu)化的離線系統(tǒng),兩者互補(bǔ)可以搭建水平擴(kuò)展的數(shù)據(jù)應(yīng)用。

hbase表設(shè)計原則:

(1)hbase表很靈活,可以用字符數(shù)組形式存儲任何東西。在同一列族里存儲相似訪問模式的所有東西。

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

(3)hbase不支持跨行事務(wù),列限定符可以用來存儲數(shù)據(jù),列族名字的長度會影響通過網(wǎng)絡(luò)傳回客戶端的數(shù)據(jù)大小(在key、value對象里),所以盡量簡練。

(4)散列支持定長鍵和更好的數(shù)據(jù)分布,但是失去排序的好處。設(shè)計hbase模式時,進(jìn)行反規(guī)范化處理是一種可行的辦法。從性能觀點看,規(guī)范化為寫做優(yōu)化,而反規(guī)范化為讀做優(yōu)化。

二、hbase常用命令列表

hbase shell命令??????????????????????????? 描述?
alter修改列族(column family)模式
count統(tǒng)計表中行的數(shù)量
create創(chuàng)建表
describe顯示表相關(guān)的詳細(xì)信息
delete刪除指定對象的值(可以為表,行,列對應(yīng)的值,另外也可以指定時間戳的值)
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ù),必須重新啟動hbase才可以恢復(fù);exit只是退出hbase shell,退出之后完全可以重新進(jìn)入。

hbase使用坐標(biāo)來定位表中的數(shù)據(jù),行鍵是第一個坐標(biāo),下一個坐標(biāo)是列族。

hbase是一個在線系統(tǒng),和hadoop mapreduce的緊密結(jié)合又賦予它離線訪問的功能。

hbase接到命令后,默認(rèn)情況下,存下變化信息或者寫入失敗異常的拋出。執(zhí)行寫入時,會寫到兩個地方:預(yù)寫式日志(write-ahead log,也稱hlog)和memstore,以保證數(shù)據(jù)持久化。memstore是內(nèi)存里的寫入緩沖區(qū)。客戶端在寫的過程中不會與底層的hfile直接交互,當(dāng)menstore寫滿時,會刷新到硬盤,生成一個新的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ù),避免硬盤讀。每個列族都有自己的block cache。block cache中的block是hbase從硬盤完成一次讀取的數(shù)據(jù)單位。block是建立索引的最小數(shù)據(jù)單位,也是從硬盤讀取的最小數(shù)據(jù)單位。如果主要用于隨機(jī)查詢,小一點的block會好一些,但是會導(dǎo)致索引變大,消耗更多內(nèi)存。如果主要執(zhí)行順序掃描,大一點的block會好一些,block變大使索引項變小,因此節(jié)省內(nèi)存。

LRU是Least Recently Used 近期最少使用算法,是內(nèi)存管理的一種頁面置換算法。對于在內(nèi)存中但又不用的數(shù)據(jù)塊(內(nèi)存塊),操作系統(tǒng)會根據(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中的表至少有一個列族。它們之中,列族直接影響hbase數(shù)據(jù)存儲的物理特性。
# 語法:create <table>, {NAME => <family>, VERSIONS => <VERSIONS>}
# 例如:創(chuàng)建表t1,有兩個family name:f1,f2,且版本數(shù)均為2。

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

執(zhí)行結(jié)果:

3)刪除表
分兩步:首先disable表,然后drop表。
例如:刪除表t1。

hbase(main)>?disable 't1'hbase(main)>?drop 't1'

執(zhí)行結(jié)果:

4)查看表的結(jié)構(gòu)?
# 語法:describe(desc) <table>?(可以看到這個表的所有默認(rèn)參數(shù))
# 例如:查看表t1的結(jié)構(gòu)

hbase(main)>?describe 't1'

或者

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天。

hbase(main)>?disable 'test1' hbase(main)>?alter 'test1',{NAME=>'body',TTL=>'15552000'},{NAME=>'meta', TTL=>'15552000'} hbase(main)>?enable 'test1'

執(zhí)行結(jié)果:

3.2?權(quán)限管理

1)分配權(quán)限

# 語法 : grant <user> <permissions> <table> <column family> <column qualifier> 參數(shù)后面用逗號分隔

# 權(quán)限用五個字母表示: "RWXCA"。

#?READ('R'), WRITE('W'), EXEC('X'), CREATE('C'), ADMIN('A')
# 例如,給用戶‘test'分配對表t1有讀寫的權(quán)限。

hbase(main)> grant 'test','RW','t1'

2)查看權(quán)限
# 語法:user_permission <table>
# 例如,查看表t1的權(quán)限列表。

hbase(main)> user_permission 't1'

3)收回權(quán)限
# 與分配權(quán)限類似,語法:revoke <user> <table> <column family> <column qualifier>
# 例如,收回test用戶在表t1上的權(quán)限。

hbase(main)> revoke 'test','t1'

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)。

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

執(zhí)行結(jié)果:

?2)查詢數(shù)據(jù)
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'

執(zhí)行結(jié)果:

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

hbase(main)>?scan 't1',{LIMIT=>5}?

執(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。

hbase(main)>?count 't1', {INTERVAL => 100, CACHE => 500}

3)刪除數(shù)據(jù)

?a.?刪除行中的某個列值
# 語法:delete <table>, <rowkey>, ?<family:column> , <timestamp>,必須指定列名
# 例如:刪除表t1,rowkey001中的f1:col1的數(shù)據(jù)。

hbase(main)>?delete 't1','rowkey001','f1:col1'

注:將刪除該行f1:col1列所有版本的數(shù)據(jù)。

b.?刪除行
# 語法:deleteall <table>, <rowkey>, ?<family:column> , <timestamp>,可以不指定列名,刪除整行數(shù)據(jù)
# 例如:刪除表t1,rowk001的數(shù)據(jù)。

hbase(main)>?deleteall 't1','rowkey001'

c. 刪除表中的所有數(shù)據(jù)
# 語法: truncate <table>
# 其具體過程是:disable table -> drop table -> create table。
# 例如:刪除表t1的所有數(shù)據(jù)。

hbase(main)>?truncate 't1'

3.4 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)開啟/關(guān)閉region
# 語法:balance_switch true|false

hbase(main)> balance_switch

3)手動split
# 語法:split 'regionName', 'splitKey'


4)手動觸發(fā)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'

3.5?配置管理及節(jié)點重啟

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

#關(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"

#啟動:

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.建立一個有3個column family的表

create 't1', {NAME => 'f1', VERSIONS => 1}, {NAME => 'f2', VERSIONS => 1}, {NAME => 'f3', VERSIONS => 1}

定義表的時候,只需要指定column family的名字,列名在put的時候動態(tài)指定。

2.插入數(shù)據(jù)
下面插入沒有指定column的family。

put 't1', 'r1', 'f1', 'v1' put 't1', 'r2', 'f2', 'v2' put 't1', 'r3', 'f3', 'v3'

下面插入指定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ù)

put 't1', 'r7', 'f1:c4', 'v9' put 't1', 'r7', 'f2:c3', 'v9' put 't1', 'r7', 'f3:c2', 'v9'

5.手工把memstore寫到hfile中

flush 't1'

每次flash都會建一個新的hfile。

6.刪除所有CF3的數(shù)據(jù)

deleteall 't1','r7'

再次刷新

flush 't1'

通過hadoop命令查看hbase目錄

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

數(shù)據(jù)是直接存到CF目錄下的,每個CF目錄下有3到4個Hfile。
查看結(jié)果為

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

f3數(shù)據(jù)雖然被刪除了,由于沒有合并文件,還依然存在。

注意:一次只能put一個column,一次只能delete一個column。刪除整行,使用deleteall命令。

deleteall 't1', 'r1'

總結(jié)

以上是生活随笔為你收集整理的HBase常用Shell命令详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。