HBase中如何开发LoadBalance插件

标签: 数据挖掘 | 发表时间:2012-05-16 17:58 | 作者:莫问
出处:http://www.searchtb.com

HBase 中的LoadBalancer策略控制了如何在集群启动时Assign所有用户Region到各个RegionServer上,以及如何定期检查Region分布情况并重新调整Region位置的。这些工作在0.92之前的版本中都是在HBase Master内核中实现的,开发人员如果希望扩展自己的LoadBalancer插件,只能Hack源码,但这随着社区版本的升级,Hack工作必须移植到新的版本中。幸好在0.92版本中,HBase将LoadBalancer策略从Master内核中抽取了出来,开放了LoadBalancer Interface,允许开发者根据自己的业务特定扩展自己的LoadBalancer插件。

定制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 {

/**

* 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 List<RegionPlan> balanceCluster(Map<ServerName, List<HRegionInfo>> clusterState);

//这个方法是HBase Master内部的balancer线程定期执行调用,用来定期检查并ReBalance集群

/**

* Perform a Round Robin assignment of regions.

* @param regions

* @param servers

* @return Map of servername to regioninfos

*/

public Map<ServerName, List<HRegionInfo>> roundRobinAssignment(List<HRegionInfo> regions, List<ServerName> 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<ServerName, List<HRegionInfo>> retainAssignment(Map<HRegionInfo, ServerName> regions, List<ServerName> 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<HRegionInfo, ServerName> immediateAssignment(List<HRegionInfo> regions, List<ServerName> servers);

// 这个方法用来立即将目标regions进行assign,主要是要快速assign,可以暂时忽略均衡问题,交由balancer线程后续定期rebalance解决

/**

* Get a random region server from the list

* @param servers

* @return Servername

*/

public ServerName randomAssignment(List<ServerName> 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中的以下几个主要方法:

  • Map<ServerName, List<HRegionInfo>> roundRobinAssignment(List<HRegionInfo>, List<ServerName>),HBase Master启动时将各个用户Table的Regions依次均匀assign到各个RegionServer中,这个可以参考DefaultLoadBalancer中的实现
  • Map<ServerName, List<HRegionInfo>> retainAssignment(Map<HRegionInfo, ServerName> regions, List<ServerName> servers), HBase Master启动时如果发现hbase.master.startup.retainassign设为true了,则不会进行roundRobinAssignment,而是调用这个方法保持上一次集群的region assign方案,这个方法也可以参考DefaultLoadBalancer中的实现
  • List<RegionPlan> balanceCluster(Map<ServerName, List<HRegionInfo>> clusterState),HBase Master中Balancer线程定期调用这个方法来进行ReBalance,这个方法是我们需要重点关注的,也是定制的关键,在这个方法中,我们主要进行了2个步骤:
  1. 遍历当前各个table的regions在RegionServer中的分布情况,计算出各个table在每个RegionServer中应该的均匀region数量
  2. 重新遍历当前各个table的regions在RegionServer中的分布情况,对于每个Table,根据第一步的计算出的均匀负载值,生成RegionPlan List,将每个RegionServer中超出均匀负载的region移到低于均匀负载的RegionServer中。在这个步骤中,同样需要保证每个RegionServer中总的Region数量是均衡的,这需要算法实现保证,稍有算法基础的开发人员应该可以很容易做到,这里就不细说了。
  • Map<HRegionInfo, ServerName> immediateAssignment(List<HRegionInfo> regions, List<ServerName> servers),这个方法是用来快速assign region的,无需考虑复杂因素,因此这个方法也可以参考DefaultLoadBalancer中的实现,无需定制
  • ServerName randomAssignment(List<ServerName> servers), 这个方法是随机选择一个Live的RegionServer来作为assign的目标,因此这个方法也可以参考DefaultLoadBalancer中的实现

至于LoadBalancer Interface中的其他几个方法,都是设置环境和配置信息的,因此完全拷贝DefaultLoadBalancer中的实现即可。

本文主要介绍了HBase 0.92中如何开发LoadBalancer插件的方法,以及我们如何定制Table-Level的LoadBalancer插件。此外,还有一些其他的LoadBalancer插件思路也是不错的选择,例如:基于Region I/O负载的LoadBalancer插件,以及基于HDFS Block Locality的LoadBalancer插件,我们后续将进行更多的尝试和介绍

相关 [hbase 开发 loadbalance] 推荐:

HBase中如何开发LoadBalance插件

- - 搜索技术博客-淘宝
HBase 中的LoadBalancer策略控制了如何在集群启动时Assign所有用户Region到各个RegionServer上,以及如何定期检查Region分布情况并重新调整Region位置的. 这些工作在0.92之前的版本中都是在HBase Master内核中实现的,开发人员如果希望扩展自己的LoadBalancer插件,只能Hack源码,但这随着社区版本的升级,Hack工作必须移植到新的版本中.

HBase开发实例学习

- - 互联网 - ITeye博客
在进行Hbase开发前,需要安装JDK、 Hadoop和HBase,选择一款合适的开发IDE,具体安装方法就不介绍了,网上有很多参考资料,这里给出我的开发环境:. 操作系统:Ubuntu 14.04 LTS. Java版本:jdk1.7.0_79. Hadoop版本:hadoop-2.6.0-cdh5.7.1.

Windows7+Eclipse环境下Hbase Java客户端的开发

- - zzm
Centos 下Hbase0.98.10-hadoop2 集群的配置. 在Eclipse中创建Maven的工程. 将集群的hbase-site.xml文件放到工程的classes目录下. C:\windows\system32\drivers\etc文件,将Hbase集群的IP以及域名配置到该文件中.

hbase介绍

- AreYouOK? - 淘宝数据平台与产品部官方博客 tbdata.org
hbase是bigtable的开源山寨版本. 是建立的hdfs之上,提供高可靠性、高性能、列存储、可伸缩、实时读写的数据库系统. 它介于nosql和RDBMS之间,仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务(可通过hive支持来实现多表join等复杂操作). 主要用来存储非结构化和半结构化的松散数据.

Riak对比HBase

- - NoSQLFan
文章来自 Riak官方wiki,是一篇Riak与HBase的对比文章. Riak官方的对比通常都做得很中肯,并不刻意偏向自家产品. 对比的Riak版本是1.1.x,HBase是0.94.x. Riak 与 HBase 都是基于 Apache 2.0 licensed 发布. Riak 的实现是基于 Amazon 的 Dynamo 论文,HBase 是基于 Google 的 BigTable.

[转]HBase简介

- - 小鸥的博客
   Hbase是一个分布式开源数据库,基于Hadoop分布式文件系统,模仿并提供了基于Google文件系统的Bigtable数据库的所有功能. 其目标是处理非常庞大的表,可以用普通的计算机处理超过10亿行数据,并且有数百万列元素组成的数据表. Hbase可以直接使用本地文件系统或者Hadoop作为数据存储方式,不过为了提高数据可靠性和系统的健壮性,发挥Hbase处理大数据量等功能,需要使用Hadoop作为文件系统.

HBase表设计

- - 互联网 - ITeye博客
默认情况下,在创建HBase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户端都向这一个region写数据, 直到这 个region足够大了才进行切分. 一种可以加快批量写入速度的方法是通过预先创建一些空的regions,这样当数据写入HBase时,会按 照 region分区情况,在集群内做数据的负载均衡.

HBase Memstore配置

- - 行业应用 - ITeye博客
HBase Memstore配置. 本文为翻译,原英文地址:http://blog.sematext.com/2012/07/16/hbase-memstore-what-you-should-know/.     当regionserver(以下简称RS)收到一个写请求,会将这个请求定位到某个特定的region.

hbase原理

- - CSDN博客云计算推荐文章
1.hbase利用hdfs作为其文件存储系统,利用mapreduce来处理数据,利用zookeeper作为协调工具. 2.行键(row key),类似于主键,但row key是表自带的. 3.列族(column family) ,列(也称作标签/修饰符)的集合,定义表的时候指定的,列是在插入记录的时候动态增加的.

hbase锁机制

- - 数据库 - ITeye博客
博文说明:1、研究版本hbase0.94.12;2、贴出的源代码可能会有删减,只保留关键的代码.   hbase的锁是采用jdk的ReentrantReadWriteLock类实现.   一、HRegion有两种锁:lock、updatesLock,这两种锁均是ReentrantReadWriteLock类的实例,基本上所有的region操作均需要获取lock的read共享锁,在获取了lock的read锁后,如果是增加或者删除等影响数据内容的操作则还需要获取updatesLock的read锁.