Hbase資源管理 Quotas

生產中,每個業務之間的重要性是不一致的,每個業務的數據量、讀寫需求也不一致,在1.1之前,一個集羣中往往有很多個業務,有的同學可以執行一個耗時的scan操作,整個集羣的資源被大量佔用,其它非常重要的業務就被擠壓的資源,造成一系列的事故,所以,很多時候,都會把hbase分成很多個集羣,重要的業務單獨一個集羣,不重要的、數據量不大的再湊合湊合,又是一個集羣,這樣往往一個集羣不會很大,造成一系列問題,集羣管理複雜,監控重複很多,集羣的資源得不到充分利用等等問題。

基於這些問題,hbase提出了Quotas,它可以限制namespace,user,table這些級別,涉及read/write的限制,包括限制單位時間的條數和size。

Enabling Quotas

Quotas默認是關閉的,需要打開,只需要在hbase-site.xml配置中寫入hbase.quota.enabled,設置爲true就可以了,官網說(This expiration period defaults to 5 minutes.)就是配置好了,默認5分鐘就會生效(測試等了20多分鐘都不行,就重啓了一下)

Quota Syntax

1.THROTTLE_TYPE可以表示爲READ,WRITE或默認類型(read+write)。

2.時間單位表示:sec,min,hour,day

3.size限制單位表示:B(字節), K(千字節), M(兆字節), G(千兆字節), T(兆兆字節),P(PB級)

4.請求數的限制表示爲整數,後跟字符串 req,如1000rep/sec:表示1秒限制爲1000條

5.table或namespace的數量表示爲整數,比如一個namespace限制創建多少張表

Setting Request Quotas

#將用戶u1限制爲每秒10個請求
hbase> set_quota TYPE => THROTTLE,USER =>'u1',LIMIT =>'10req/sec' 

#將用戶u1限制爲每秒10個讀取請求
hbase> set_quota TYPE => THROTTLE, THROTTLE_TYPE => READ,USER =>'u1',LIMIT =>'10req/sec' 

#將用戶u1限制爲每天10 M 
hbase> set_quota TYPE => THROTTLE,USER =>'u1',LIMIT =>'10M/day' 

#將用戶u1限制爲每秒10 M寫入大小
hbase> set_quota TYPE => THROTTLE,THROTTLE_TYPE => WRITE,USER =>'u1',LIMIT =>'10M/sec' 

#將用戶u1限制爲每分鐘5k在表t2 
hbase> set_quota TYPE => THROTTLE,USER =>'u1',TABLE =>'t2',LIMIT =>'5K/min' 

#在表t2上將用戶u1限制爲每秒10次讀取請求
hbase> set_quota TYPE => THROTTLE,THROTTLE_TYPE => READ,USER =>'u1',TABLE =>'t2',LIMIT =>'10req/sec' 

#在用戶名u1上刪除用戶u1的現有限制ns2 
hbase> set_quota TYPE => THROTTLE,USER =>'u1',NAMESPACE =>'ns2',LIMIT => NONE 

#限制所有用戶在命名空間上每小時發出10個請求ns1 
hbase> set_quota TYPE => THROTTLE,NAMESPACE =>'ns1',LIMIT =>'10req/hour' 

#在表t1 
上將所有用戶限制爲每小時10T hbase> set_quota TYPE => THROTTLE,TABLE =>'t1',LIMIT =>'10T/hour' 

#從用戶u1中刪除所有現有限制
hbase> set_quota TYPE => THROTTLE,USER =>'u1',LIMIT =>NONE 

#列出命名空間中用戶u1的所有quota ns2 
hbase> list_quotas USER =>'u1,NAMESPACE =>'ns2'

#列出名稱空間的所有quota s2 
hbase> list_quotas NAMESPACE =>'ns2' 

#列出表t1 hbase的所有quotas
> list_quotas TABLE =>'t1' 

#list all quotas 
hbase> list_quotas

可以通過應用GLOBAL_BYPASS屬性來設置全侷限制並從限制中排除用戶或表,就是設置心悅會員的意思

hbase> set_quota NAMESPACE =>'ns1',LIMIT =>'100req/min'#每個命名空間請求限制
hbase> set_quota USER =>'u1',GLOBAL_BYPASS => true #user u1不受限制

Limiting Tables Per Namespace

#創建一個最多包含5個表的命名空間
hbase> create_namespace'ns1',{'hbase.namespace.quota.maxtables'=>'5'} 

#更改現有命名空間,最多包含8個表
hbase> alter_namespace'ns2 ',{METHOD =>'set','hbase.namespace.quota.maxtables'=>'8'} 

#顯示命名空間的quota信息
hbase> describe_namespace'ns2' 

#更改現有命名空間以刪除quota
hbase> alter_namespace 'ns2',{METHOD =>'unset',NAME =>'hbase.namespace.quota.maxtables'}

Limiting Regions Per Namespace

#創建一個最多包含10個區域的命名空間
hbase> create_namespace'ns1',{'hbase.namespace.quota.maxregions'=>'10' 

#顯示命名空間hbase的quota信息 describe_namespace'ns1' 

#更改現有命名空間最多有20個表
hbase> alter_namespace'ns2',{METHOD =>'set','hbase.namespace.quota.maxregions'=>'20'} 

#更改現有命名空間以刪除quota
hbase> alter_namespace' ns2',{METHOD =>'unset',NAME =>'hbase.namespace.quota.maxregions'}

Space Quotas

HBASE-16961引入了一種新的HBase Quotas來利用:filesystem quotas。這些'space'qutas能限制namespace和table的size大小。這樣做的原因也很簡單,如果不加限制的話,用戶可以無限制的往表中寫數據,極端的情況是,大量的數據寫入,造成沒有空間可以,那麼,hbase就會彭奎,因爲hbase無法預寫日誌或者同步數據。

現有的set_quota和list_quotaHBase shell命令可用於與空間配額交互。空間配額是有配額TYPE的SPACE,並具有LIMIT和POLICY 屬性。這LIMIT是一個字符串,指的是文件系統上的配額主題(例如表或命名空間)可能佔用的空間量。例如,有效的值LIMIT是'10G','2T',或'256M'。該POLICY指當配額對象的使用量超過該HBase的將採取行動LIMIT。以下是有效值POLICY。

NO_INSERTS - No new data may be written (e.g. Put, Increment, Append).

NO_WRITES - Same as NO_INSERTS but Deletes are also disallowed.

NO_WRITES_COMPACTIONS - Same as NO_WRITES but compactions are also disallowed.

DISABLE - The table(s) are disabled, preventing all read/write access.

Setting simple space quotas

# Sets a quota on the table 't1' with a limit of 1GB, disallowing Puts/Increments/Appends when the table exceeds 1GB
hbase> set_quota TYPE => SPACE, TABLE => 't1', LIMIT => '1G', POLICY => NO_INSERTS

# Sets a quota on the namespace 'ns1' with a limit of 50TB, disallowing Puts/Increments/Appends/Deletes
hbase> set_quota TYPE => SPACE, NAMESPACE => 'ns1', LIMIT => '50T', POLICY => NO_WRITES

# Sets a quota on the table 't3' with a limit of 2TB, disallowing any writes and compactions when the table exceeds 2TB.
hbase> set_quota TYPE => SPACE, TABLE => 't3', LIMIT => '2T', POLICY => NO_WRITES_COMPACTIONS

# Sets a quota on the table 't2' with a limit of 50GB, disabling the table when it exceeds 50GB
hbase> set_quota TYPE => SPACE, TABLE => 't2', LIMIT => '50G', POLICY => DISABLE

Table and Namespace space quotas

hbase> create_namespace 'ns1'
hbase> create 'ns1:t1'
hbase> create 'ns1:t2'
hbase> create 'ns1:t3'
hbase> set_quota TYPE => SPACE, NAMESPACE => 'ns1', LIMIT => '100T', POLICY => NO_INSERTS
hbase> set_quota TYPE => SPACE, TABLE => 'ns1:t2', LIMIT => '200G', POLICY => NO_WRITES
hbase> set_quota TYPE => SPACE, TABLE => 'ns1:t3', LIMIT => '20T', POLICY => NO_WRITES

在上面的場景中,ns1不允許命名空間中的表在文件系統之間消耗超過100TB的空間。表'ns1:t2'的大小僅允許爲200GB,並且當使用率超過此限制時將禁止所有寫入。表'ns1:t3'的大小允許增長到20TB,並且還將禁止所有寫入,然後使用超出此限制。由於'ns1:t1'上沒有表配額,因此該表可以增長到100TB,但僅當'ns1:t2'和'ns1:t3'使用零字節時纔會增長。實際上,它的限制是'ns1:t2'和'ns1:t3'的當前使用量減去100TB。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章