HBase 1.1.3 中如何开发LoadBalance插件

定制LoadBalancer插件需要两个步骤:

1、继承org.apache.hadoop.hbase.master.LoadBalancer Interface,实现自己的LoadBalancer Class。

2、在hbase-site.xml中增加配置项,使得定制的LoadBalancer生效

<property>
<name>hbase.master.loadbalancer.class</name>
<value>{your custom loadbalancer class name}</value>
<description></description>
</property>


开发LoadBalancer插件的前提准备工作便是清楚了解org.apache.hadoop.hbase.master.LoadBalancer这个Interface:
public interface LoadBalancer extends Configurable, Stoppable, ConfigurationObserver {

  /**
   * Set the current cluster status.  This allows a LoadBalancer to map host name to a server
   * @param st
   */
  void setClusterStatus(ClusterStatus st);

  /**
   * Set the master service.
   * @param masterServices
   */
  void setMasterServices(MasterServices masterServices);

  /**
   * Perform the major balance operation
   * @param clusterState
   * @return List of plans
   */
   //这个方法是HBase Master内部的balancer线程定期执行调用,用来定期检查并ReBalance集群
  List<RegionPlan> balanceCluster(Map<ServerName,
      List<HRegionInfo>> clusterState) throws HBaseIOException;

  /**
   * Perform a Round Robin assignment of regions.
   * @param regions
   * @param servers
   * @return Map of servername to regioninfos
   */
   //这个方法是HBase Master在启动时调用的,用来批量调度所有用户Region到RegionServer上(hbase.master.startup.retainassign设置为false时生效,与retainAssignment互斥)
  Map<ServerName, List<HRegionInfo>> roundRobinAssignment(
    List<HRegionInfo> regions,
    List<ServerName> servers
  ) throws HBaseIOException;

  /**
   * Assign regions to the previously hosting region server
   * @param regions
   * @param servers
   * @return List of plans
   */
   //这个方法是HBase Master在启动时调用的,可以保持上次集群中Region的分布位置不变(hbase.master.startup.retainassign设置为true时生效,与roundRobinAssignment互斥)
  Map<ServerName, List<HRegionInfo>> retainAssignment(
    Map<HRegionInfo, ServerName> regions,
    List<ServerName> servers
  ) throws HBaseIOException;

  /**
   * Sync assign a region
   * @param regions
   * @param servers
    * @return Map regioninfos to servernames
   */
   // 这个方法用来立即将目标regions进行assign,主要是要快速assign,可以暂时忽略均衡问题,交由balancer线程后续定期rebalance解决
  Map<HRegionInfo, ServerName> immediateAssignment(
    List<HRegionInfo> regions,
    List<ServerName> servers
  ) throws HBaseIOException;

  /**
   * Get a random region server from the list
   * @param regionInfo Region for which this selection is being done.
   * @param servers
   * @return Servername
   */
   // 这个方法是在随机assign一个region时被调用,从当前live的regionservers中选取一个随机的server作为assignregion的目标,
  ServerName randomAssignment(
    HRegionInfo regionInfo, List<ServerName> servers
  ) throws HBaseIOException;


  /**
   * Initialize the load balancer. Must be called after setters.
   * @throws HBaseIOException
   */
  void initialize() throws HBaseIOException;


  /**
   * Marks the region as online at balancer.
   * @param regionInfo
   * @param sn
   */
  void regionOnline(HRegionInfo regionInfo, ServerName sn);


  /**
   * Marks the region as offline at balancer.
   * @param regionInfo
   */
  void regionOffline(HRegionInfo regionInfo);


  /*
   * Notification that config has changed
   * @param conf
   */
  void onConfigurationChange(Configuration conf);
}


重点关注LoadBalancer Interface中的以下几个主要方法:

1、Map<ServerName, List<HRegionInfo>> roundRobinAssignment(List<HRegionInfo>, List<ServerName>)

HBase Master启动时将各个用户Table的Regions依次均匀assign到各个RegionServer中,这个可以参考低版本的DefaultLoadBalancer中的实现或者高版本中的StochasticLoadBalancer、BaseLoadBalancer的实现。


2、Map<ServerName, List<HRegionInfo>> retainAssignment(Map<HRegionInfo, ServerName> regions, List<ServerName> servers)

 HBase Master启动时如果发现hbase.master.startup.retainassign设为true了,则不会进行roundRobinAssignment,而是调用这个方法保持上一次集群的region assign方案,这个方法也可以参考低版本的DefaultLoadBalancer中的实现或者高版本中的StochasticLoadBalancer、BaseLoadBalancer的实现。


3、List<RegionPlan> balanceCluster(Map<ServerName, List<HRegionInfo>> clusterState)

HBase Master中Balancer线程定期调用这个方法来进行ReBalance

4、Map<HRegionInfo, ServerName> immediateAssignment(List<HRegionInfo> regions, List<ServerName> servers)

这个方法是用来快速assign region的,无需考虑复杂因素,因此这个方法也可以参考低版本DefaultLoadBalancer中的实现或者高版本中的StochasticLoadBalancer、BaseLoadBalancer的实现。

5、ServerName randomAssignment(List<ServerName> servers),

这个方法是随机选择一个Live的RegionServer来作为assign的目标,因此这个方法也可以参考DefaultLoadBalancer中的实现或者高版本中的StochasticLoadBalancer、BaseLoadBalancer的实现。









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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值