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的实现。