Apache HBase 负载均衡机制(三) -- StochasticLoadBalancer详解

举报
milan 发表于 2022/10/31 18:33:24 2022/10/31
【摘要】 在分布式系统中负载均衡是一个非常重要的功能,Apache HBase通常通过Region的数量实现负载均衡,StochasticLoadBalancer将不仅仅考虑Region数量,还会考虑Region负载、表负载、数据本地化、MemStore大小、Storefile大小等。本文将展开分析HBase负载均衡中StochasticLoadBalancer相关内容。

概述

在分布式系统中负载均衡是一个非常重要的功能,Apache HBase通常通过Region的数量实现负载均衡,StochasticLoadBalancer将不仅仅考虑Region数量,还会考虑Region负载、表负载、数据本地化、MemStore大小、Storefile大小等。下面将展开分析HBase负载均衡中StochasticLoadBalancer相关内容。

HBase原理

  • HBase数据模型

    HBase以表的形式存储数据,数据模型如图所示。表中的数据划分为多个Region,并由Master分配给对应的RegionServer进行管理。

    每个Region包含了表中一段RowKey区间范围内的数据,HBase的一张数据表开始只包含一个Region,随着表中数据的增多,当一个Region的大小达到容量上限后会分裂成两个Region。可以在创建表时定义Region的RowKey区间,或者在配置文件中定义Region的大小。

    图 HBase的数据模型

  • RegionServer数据存储

         RegionServer主要负责管理由HMaster分配的Region,RegionServer的数据存储结构如图 RegionServer的数据存储结构所示。

         图 RegionServer的数据存储结构

       图RegionServer的数据存储结构中Region的各部分的说明如表 Region结构说明所示。

  • 表 Region结构说明

    名称

    描述

    Store

    一个Region由一个或多个Store组成,每个Store对应图 HBase数据模型中的一个Column Family。

    MemStore

    一个Store包含一个MemStore,MemStore缓存客户端向Region插入的数据,当RegionServer中的MemStore大小达到配置的容量上限时,RegionServer会将MemStore中的数据“flush”到HDFS中。

    StoreFile

    MemStore的数据flush到HDFS后成为StoreFile,随着数据的插入,一个Store会产生多个StoreFile,当StoreFile的个数达到配置的最大值时,RegionServer会将多个StoreFile合并为一个大的StoreFile。

    HFile

    HFile定义了StoreFile在文件系统中的存储格式,它是当前HBase系统中StoreFile的具体实现。

    HLog

    HLog日志保证了当RegionServer故障的情况下用户写入的数据不丢失,RegionServer的多个Region共享一个相同的HLog。


LoadBalancer

对Region的放置和移动做出决策。开源社区存在多种策略可供选择:

BaseLoadBalancer

负载平衡器的基类。它提供了用于以分配Region方法,它不提供实际平衡算法的实现。提供按表级别进行负载平衡和按集群级别进行负载平衡两种方式:

    if (isByTable) {
      List<RegionPlan> result = new ArrayList<>();
      loadOfAllTable.forEach((tableName, loadOfOneTable) -> {
        LOG.info("Start Generate Balance plan for table: " + tableName);
        List<RegionPlan> partialPlans = balanceTable(tableName, loadOfOneTable);
        if (partialPlans != null) {
          result.addAll(partialPlans);
        }
      });
      return result;
    } else {
      LOG.debug("Start Generate Balance plan for cluster.");
      return balanceTable(HConstants.ENSEMBLE_TABLE_NAME, toEnsumbleTableLoad(loadOfAllTable));
    }

具体负载均衡算法在balanceTable中实现。

StochasticLoadBalancer

概述

这是一个尽力而为的负载平衡器。给定一个成本函数F(C) => x,它将随机尝试将集群突变为Cprime。如果F(Cprime) < F(C),则新的群集状态将成为执行计划。它包括用于计算以下成本的成本函数:

  • Region Load
  • Table Load
  • Data Locality
  • Memstore Sizes
  • Storefile Sizes

每个成本函数都返回一个介于0和1之间的数字;其中0是最低成本的最佳解决方案,1是最高可能的成本和最差解决方案。计算的成本按其各自的乘数按比例缩放:

  • hbase.master.balancer.stochastic.regionLoadCost
  • hbase.master.balancer.stochastic.moveCost
  • hbase.master.balancer.stochastic.tableLoadCost
  • hbase.master.balancer.stochastic.localityCost
  • hbase.master.balancer.stochastic.memstoreSizeCost
  • hbase.master.balancer.stochastic.storefileSizeCost

还可以通过设置以下配置值来添加自定义Cost函数:hbase.master.balancer.stochastic.additionalCostFunctions。所有自定义CostFunction都需要扩展CostFunction。

除了上述配置外,平衡器还可以通过以下配置值调整:

  • hbase.master.balancer.stochastic.maxMoveRegions,它控制在此平衡器的一次调用中可以移动的最大区域数量。
  • hbase.master.balancer.stochastic.stepsPerRegion,它是区域数量乘以的系数,以尝试获取平衡器将突变所有服务器的次数。
  • hbase.master.balancer.stochastic.maxSteps,它控制平衡器尝试和移动所有服务器的最大次数。平衡器将使用此值和上述计算的最小值。

流程




【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。