HBase quota机制源码阅读

第二版介绍:https://blog.csdn.net/Gloria_y/article/details/104266474
相关patch:https://issues.apache.org/jira/browse/HBASE-11598
REVIEW BOARD: https://reviews.apache.org/r/23981

#quota设置与应用过程

1.客户端通过admin.setQuota发送序列化的quotaSetting信息给服务端master接收quotaSetting,并将数据写入hbase:quota表

2.regionserver通过一个Chore定时任务,每隔一段时间去获取hbase:quota中的配置,放到quotaCache中

3.当有用户读写操作时,在RSRpcService中获取请求的大小,看是否达到阈值(checkQuota方法),达到阈值就抛出异常,否则就进行累加

master端和regionserver端都有对应的manager类,管理quota相关的操作(setQuota以及读写hbase:quota,checkQuota等)

#相关类
##客户端设置Quota

  • **ConnectionManager:增加方法setQuota(RpcController controller, SetQuotaRequest request) **
  • Admin.java:接口类 ,主要涉及到方法是setQuota(QuotaSettings) , getQuotaRetriever(QuotaFilter)
  • **HBaseAdmin.java:增加方法setQuota(QuotaSettings)主要用户管理员设置quota,getQuotaRetriever(final QuotaFilter filter)quota信息查找 **
  • **QuotaSettings:抽象类,username,tablename,namespace,get QuotaType,以及SetQuotaRequest.builder 生成序列化数据的方法 **
  • **QuotaSettingsFactory:生成quotasettings实例的工厂类,返回的quotaSetting实际类型是ThrottleSettings或者QuotaGlobalsSettingsBypass,rb代码中最终通过admin.setQuotas参数就是这个类对应的方法返回值 **

###序列化quota信息

  • ProtobufUtil.java :toTimeUnit、toProtoTimeUnit、toThrottleType、toQuotaScope、toProtoQuotaScope 等有关Quota信息序列化的操作 ,TimeUnit中设置的是有关时间的单位

客户端查询quota设置

  • QuotaFilter:list_quota时候,通过表达式过滤需要的quota

  • **QuotaScope:枚举类,CLUSTER集群级别的quota(多个机器请求量加起来),MACHINE机器级别的quota **

##HMaster端

  • **QuotaType:枚举类THROTTLE和GLOBAL_BYPASS **
  • **ThrottleSettings:QuotaSetting的实现类,最常用的阈值处理逻辑 **
  • **HBase.proto:增加了枚举类TimeUnit(时间单位) **
  • Master.proto:增加了以下内容
    SetQuotaRequest:user_name,
    user_group,
    namespace,
    table_name,
    remove_all,
    bypass_globals,
    ThrottleRequest,
    以及SetQuota(SetQuotaRequest) returns(SetQuotaResponse);
  • **Quota.proto:QuotaScope,TimedQuota,ThrottleType(阈值类型,读写操作数量,读写操作数据量,REQUEST_NUMBER?REQUEST_SIZE?) **
  • **BaseMasterAndRegionObserver.java:接口类:pre/post set User/Table/NameSpace Quota 定义了一些在设置 quota前后要执行的操作,例如开启acl之后,要检查是否为admin权限 **
  • **BaseMasterObserver.java:同上 **
    _ **MasterObserver.java:同上 **
  • **HMaster.java:MasterQuotaManager quotaManager; **
  • **MasterRpcServices.java: Master端处理RPC的类 增加方法setQuota(RpcController c, SetQuotaRequest req) **
  • **MasterQuotaManager.java:master端管理quota操作的类,管理员设置quota(admin.setQuota)–> masterRpcService调用MasterQuotaManager的setquota方法,manager调用QuotaUtil的增删改查hbase:quota表的方法,以及创建hbase:quota表 **
  • **QuotaTableUtil:设置quota时,通过这个类对hbase:quota表进行操作 **

#RegionServer端:

  • **QuotaCache:regionserver上缓存quota设置的类,里面有Chore的实现,定时从hbase:quota表获取quota设置 **
    Chore:hbase中做定时任务的一个类,应用有TimeoutMonitor,ConnectionCache中的cleaner,BalancerChore,ClusterStatusChore,CleanerChore,CompactionChecker等
  • QuotaRetriever:扫描遍历quota设置的类,查询QUOTA_TABLE_NAME表,并把结果放到cache里面
  • **QuotaLimiter:接口类,实现类为TimeBasedLimiter.java **
  • QuotaLimiterFactory.java :QuotaLimiter的工厂类
  • QuotaState.java: QuotaCache中用到 ?
  • **DefaultOperationQuota.java:regionserver上rpcService接受读写操作之后,调用这个类的checkQuota方法,重要方法1:checkQuota里面有estimateConsume方法去计算这次请求的消耗,判断是否超过阈值,重要方法2:close,里面调用了limiter.addOperationSize,把操作值累加起来,供下次请求判断 **
  • **NoopOperationQuota.java:一个空的OperationQuota实现,如果没有开启quota机制,就使用这个OperationQuota类型的实例 **
  • **NoopQuotaLimiter.java:一个空的QuotaLimiter实现,如果没有开启quota机制,就使用这个QuotaLimiter类型的实例 **
  • RegionServerQuotaManager.java: RSRpcService中调用这个manager,获取OperationQuota对象,执行manager.checkQuota(里面再调用OperationQuota.checkQuota)Get操作执行完,执行quota.addGetResult ,最后调用quota.close把本次操作的值累加到累加器中
  • **RateLimiter.java:实际计算是否超过阈值的类 **
  • **TimeBasedLimiter.java:QuotaLimiter实现,封装了读写次数,读写量,请求次数,请求量的RateLimiter **
  • QuotaExceededException:quota 超出阈值时异常
  • **ThrottlingException:checkQuota异常的时候会抛出ThrottlingException,继承了QuotaExceededException **

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值