HBase 1.1.3 中如何开发LoadBalance插件

来源:互联网 发布:淘宝重复开店2017处罚 编辑:程序博客网 时间:2024/06/05 11:09
定制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
原创粉丝点击