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。

你可能感兴趣的:(Hbase)