HBase中如何开发LoadBalance插件
HBase 中的LoadBalancer策略控制了如何在集群启动时Assign所有用户Region到各个RegionServer上,以及如何定期检查Region分布情况并重新调整Region位置的。这些工作在0.92之前的版本中都是在HBase Master内核中实现的,开发人员如果希望扩展自己的LoadBalancer插件,只能Hack源码,但这随着社区版本的升级,Hack工作必须移植到新的版本中。幸好在0.92版本中,HBase将LoadBalancer策略从Master内核中抽取了出来,开放了LoadBalancer Interface,允许开发者根据自己的业务特定扩展自己的LoadBalancer插件。
定制LoadBalancer插件需要两个步骤:
因此,开发LoadBalancer插件的前提准备工作便是清楚了解org.apache.hadoop.hbase.master.LoadBalancer这个Interface:
public interface LoadBalancer extends Configurable { /** * Set the current cluster status. This allows a LoadBalancer to map host name to a server * @param st */ public void setClusterStatus(ClusterStatus st); //这个方法一般参考org.apache.hadoop.hbase.master.DefaultLoadBalancer即可,无需定制 /** * Set the master service. * @param masterServices */ public void setMasterServices(MasterServices masterServices); //这个方法一般参考org.apache.hadoop.hbase.master.DefaultLoadBalancer即可,无需定制 /** * Perform the major balance operation * @param clusterState * @return List of plans */ public ListbalanceCluster(Map > clusterState); //这个方法是HBase Master内部的balancer线程定期执行调用,用来定期检查并ReBalance集群 /** * Perform a Round Robin assignment of regions. * @param regions * @param servers * @return Map of servername to regioninfos */ public Map > roundRobinAssignment(List regions, List servers); //这个方法是HBase Master在启动时调用的,用来批量调度所有用户Region到RegionServer上(hbase.master.startup.retainassign设置为false时生效,与retainAssignment互斥) /** * Assign regions to the previously hosting region server * @param regions * @param servers * @return List of plans */ public Map > retainAssignment(Map regions, List servers); //这个方法是HBase Master在启动时调用的,可以保持上次集群中Region的分布位置不变(hbase.master.startup.retainassign设置为true时生效,与roundRobinAssignment互斥) /** * Sync assign a region * @param regions * @param servers * @return Map regioninfos to servernames */ public Map immediateAssignment(List regions, List servers); // 这个方法用来立即将目标regions进行assign,主要是要快速assign,可以暂时忽略均衡问题,交由balancer线程后续定期rebalance解决 /** * Get a random region server from the list * @param servers * @return Servername */ public ServerName randomAssignment(List servers); // 这个方法是在随机assign一个region时被调用,从当前live的regionservers中选取一个随机的server作为assignregion的目标, }
在熟悉了LoadBalancer接口之后,我们可以开始创建一个自定义的LoadBalancer Class,实现定制化的Balance策略。HBase中默认的Balance策略是RegionServer级别的,即保证每个RegionServer中的Region数量均衡,但没有考虑到每个Table内部的Regions在所有RegionServers中的均衡,下图可以清晰的描述这个问题:
由上图可以看出,各个RegionServer中的Regions数量是均衡的,但是每个Table内部都是不均衡的,因此各个Table的访问者很容易出现局部访问热点。我们定制Table Level的LoadBalancer不仅要实现RegionServer级别的Balance,同时也要实现Table级别的Balance,如下图所示:
由上图可以看出,不仅RegionServer间保持均衡,每个Table内部的Region也是均匀分布的。具体实现TableLevelLoadBalancer是,要重点关注LoadBalancer Interface中的以下几个主要方法:
至于LoadBalancer Interface中的其他几个方法,都是设置环境和配置信息的,因此完全拷贝DefaultLoadBalancer中的实现即可。
本文主要介绍了HBase 0.92中如何开发LoadBalancer插件的方法,以及我们如何定制Table-Level的LoadBalancer插件。此外,还有一些其他的LoadBalancer插件思路也是不错的选择,例如:基于Region I/O负载的LoadBalancer插件,以及基于HDFS Block Locality的LoadBalancer插件,我们后续将进行更多的尝试和介绍
建议继续学习:
- HBase集群出现NotServingRegionException问题的排查及解决方法 (阅读:16277)
- HFile存储格式 (阅读:14597)
- hbase运维 (阅读:13697)
- hbase介绍 (阅读:11097)
- HBase技术介绍 (阅读:6824)
- HBase随机写以及随机读性能测试 (阅读:6505)
- HBase性能优化方法总结 (阅读:5844)
- HBase二级索引与Join (阅读:5846)
- HBase Thrift 接口使用注意事项 (阅读:5459)
- Cassandra和HBase主要设计思路对比 (阅读:4151)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:莫问 来源: 搜索技术博客-淘宝
- 标签: HBase LoadBalance
- 发布时间:2012-05-17 23:34:55
- [69] Twitter/微博客的学习摘要
- [65] find命令的一点注意事项
- [64] 如何拿下简短的域名
- [64] IOS安全–浅谈关于IOS加固的几种方法
- [62] Go Reflect 性能
- [62] android 开发入门
- [61] 流程管理与用户研究
- [59] Oracle MTS模式下 进程地址与会话信
- [58] 读书笔记-壹百度:百度十年千倍的29条法则
- [58] 图书馆的世界纪录