hbase资源管理

概述

在HBase-1.1.0之前,HBase集群中资源都是全量的。用户、表这些都是没有限制的,看似完美实则隐患较大。

流量限制

为什么要做流量限制,无限制全量跑不是更好吗?

比如今天的双十一日,数据流量是非常大的。如果不限制用户和表的流量,某些重要的核心业务,需要在资源有限的情况下优先保证正常运行。如果非核心业务在此期间其QPS一直降不下来,严重消耗系统资源,影响核心业务的正常运作。

针对上述问题,可以采取以下方案来解决:

资源限制:针对用户、命名空间及表的请求大小和QPS进行限制。
资源隔离:将不同表中的数据通过物理隔离,均衡到不同的RegionServer上。

资源限制

开启HBase资源限制是有条件,其中包含以下两个条件:

1.版本必须在1.1.0以上,或者在低版本中打上了HBase对应的Patch(HBASE-115982.HBase的资源限制开关默认是关闭的,需要在HBase的配置文件中进行开启。
# 编辑HBase配置文件
vi hbase-site.xml
 
# 添加如下内容
 <property>
   <name>hbase.quota.enabled</name>
   <value>true</value>
 </property>
 
# 退出编辑并保存

首次启动时配置的,需要重启HMaster服务进程才能生效。

Quota语句

req/time:单位时间内的请求次数,

size/time:单位时间内的请求数据的大小

req:整数,请求次数

time:时间单位,sec, min, hour, day (秒,分钟,小时,天)

size: 存储单位

B (bytes), K (kilobytes), M (megabytes), G(gigabytes), T (terabytes), P (petabytes)

命令
list_quotas, set_quota TYPE => <type>, <args>

Quota参数:

TYPE => THROTTLE

THROTTLE_TYPE:可以表示为READ,WRITE或默认类型(读取+写入)。

HBase中限流是通过Quota语句来操作的,限流的方式有两种,一种是针对用户进行限流;另一种是针对表来进行限流。

# 限制用户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每天的请求量为10M
hbase> set_quota TYPE => THROTTLE, USER => 'u1', LIMIT => '10M/day'
 
# 限制用户u1的写请求量每秒为10M
hbase> set_quota TYPE => THROTTLE, THROTTLE_TYPE => WRITE, USER => 'u1', LIMIT => '10M/sec'
 
# 限制用户u1在操作表t2时,每分钟的请求量为5K
hbase> set_quota TYPE => THROTTLE, USER => 'u1', TABLE => 't2', LIMIT => '5K/min'
 
# 限制用户u1在操作表t2时,每秒的读请求为10次
hbase> set_quota TYPE => THROTTLE, THROTTLE_TYPE => READ, USER => 'u1', TABLE => 't2', LIMIT => '10req/sec'
 
# 删除用户u1在命令空间ns2的请求限制
hbase> set_quota TYPE => THROTTLE, USER => 'u1', NAMESPACE => 'ns2', LIMIT => NONE
 
# 限制在命名空间ns1中每小时的请求为10次
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在命名空间ns2中的所有限制详情
hbase> list_quotas USER => 'u1, NAMESPACE => 'ns2'
 
# 显示命令空间ns2的所有限制详情
hbase> list_quotas NAMESPACE => 'ns2'
 
# 显示表t1的所有限制详情
hbase> list_quotas TABLE => 't1'
 
# 显示所有限制详情
hbase> list_quotas

限制命名空间中的表个数

# 创建一个命令空间最大包含5个表
hbase> create_namespace 'ns1', {'hbase.namespace.quota.maxtables'=>'5'}
 
# 修改一个已存在的命令空间所允许的表数量大小为8个
hbase> alter_namespace 'ns2', {METHOD => 'set', 'hbase.namespace.quota.maxtables'=>'8'}
 
# 显示命令空间下的所有详情
hbase> describe_namespace 'ns2'
 
# 删除命令空间中表个数的限制
hbase> alter_namespace 'ns2', {METHOD => 'unset', NAME=>'hbase.namespace.quota.maxtables'}

限制命名空间的Region

# 创建一个命名空间最大包含10个Region
hbase> create_namespace 'ns1', {'hbase.namespace.quota.maxregions'=>'10'
 
# 显示命令空间中详情
hbase> describe_namespace 'ns1'
 
# 修改命名空间中最大Region个数为20个
hbase> alter_namespace 'ns2', {METHOD => 'set', 'hbase.namespace.quota.maxregions'=>'20'}
 
# 删除命名空间中Region个数的限制
hbase> alter_namespace 'ns2', {METHOD => 'unset', NAME=> 'hbase.namespace.quota.maxregions'}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章