HBase 可以根据当前集群的负载以region为单位进行rebalance。在HMaster中,后台会起一个线程定期检查是否需要进行rebalance,线程叫做BalancerChore。线程每隔 hbase.balancer.period会定期执行 master.balance()函数,配置项默认300000毫秒,5分钟。每次balance最多执行

hbase.balancer.max.balancing,如果没有配置,则使用hbase.balancer.period配置项的值。master.balance()首先通过loadBalancerTracker去zk上看是否load balance开启,如果开启,则从AssignmentManager中检查当前是否有region处于in transition状态,如果有,则直接返回。否则将集群的状态给balancer以便后续做决策,HMaster的assignmentManager成员内部维护着一个表在哪些机器上,这些机器上分别有哪些region。对于每张表,都会执行balancer.balanceCluster()方法。HBase中load balance的策略是可插拔的,开发者可以根据自己业务的需求来开发自己的load balance策略。在HBase中,是通过接口LoadBalancer类实现的。具体使用哪个load balance策略由配置项hbase.master.loadbalancer.class决定,默认使用StochasticLoadBalancer。所有的逻辑都在StochasticLoadBalancer这个负载均衡器的 balanceCluster()方法中。

StochasticLoadBalancer负载均衡器首先会根据每个region server上的region个数作决定要不要进行rebalance,具体方法是算出所有server的平均region个数,然后根据配置项hbase.regions.slop产生一个区间[floor(average * (1-slop)), ceil(average * (1+slop))],配置项默认0.2,如果region 个数最多的region server不比右区间大,并且region个数最少的region server不比左区间小,则说明region个数比较平均,就不进行rebalance,直接退出,等待下次调度。否则,计算当前集群状态的cost值,这个cost值的计算会考虑到移动region的成本,region 本地化策略,region count分布,每个server上table的分布等做一个加权平均。然后一共迭代computedMaxSteps次,次数由配置项hbase.master.balancer.stochastic.maxSteps和hbase.master.balancer.stochastic.stepsPerRegion,还有当前集群的region个数,server个数共同决定。每次迭代,都会随机选择一种pick region的策略,一共有三种,分别为RandomRegionPicker,LoadPicker和LocalityBasedPicker。随机选定一个picker策略后,这个picker就会从集群中选出两个用于的region或者选出一个用于迁移到其他server的region,然后更新集群状态的数据结构,重新计算当前集群状态的cost值,如果发现新的cost比原来的小,则说明,这种region的交换或者迁移是有效的。每次迭代都是基于上次的成果,总共做computedMaxSteps。最后产生出一系列的plan,每个plan就是交换region或者迁移region。对于所有的表都做一次,把所有的plan都放入AssignmentManager的regionsPlans中。然后对于每个plan,都调用assignmentManager.balance(plan),这个函数会调用unassign()方法,首先在zk上为这个region创建/hbase/region-in-transition/region_encoded_name节点,节点内容为这个原来在某个server上的region处于closing状态了,然后给这个region原来所在的server发送close region命令对region进行卸载,随后再调用public void assign(HRegionInfo region, boolean setOfflineInZK)给region的目标region server发送open region的命令,目标region server是从regionPlans中查到的。最后删除zk上的节点。其中,每次做完一个plan后都会检查是否时间到了。

参考资料

hbase-server-0.98.3-hadoop2.jar

HBase 负载均衡的更多相关文章

  1. 剖析HBase负载均衡和性能指标

    1.概述 在分布式系统中,负载均衡是一个非常重要的功能,在HBase中通过Region的数量来实现负载均衡,HBase中可以通过hbase.master.loadbalancer.class来实现自定 ...

  2. 深度剖析HBase负载均衡和性能指标

    深度剖析HBase负载均衡和性能指标 在分布式系统中,负载均衡是一个非常重要的功能,HBase通过Region的数量实现负载均衡,即通过hbase.master.loadbalancer.class实 ...

  3. Hbase负载均衡流程以及源码

    hmater负责把region均匀到各个region server .hmaster中有一个线程任务是专门处理负责均衡的,默认每隔5分钟执行一次. 每次负载均衡操作可以分为两步: 生成负载均衡计划表 ...

  4. HBASE数据模型&扩展和负载均衡理论

    示例数据模型 HBase中扩展和负载均衡的基本单元成为region,region本质上是以行健排序的连续存储区间.如果region太大,系统会把它们 自动拆分,相反的,就是把多个region合并,以减 ...

  5. HBase流量限制和表负载均衡剖析

    1.概述 在HBase-1.1.0之前,HBase集群中资源都是全量的.用户.表这些都是没有限制的,看似完美实则隐患较大.今天,笔者就给大家剖析一下HBase的流量限制和表的负载均衡. 2.内容 也许 ...

  6. HBase rebalance 负载均衡源码角度解读使用姿势

    关键词:hbase rebalance 负载均衡 参考源码版本:apache-hbase-1.1.2 什么是HBase Rebalance ? 随着数据写入越来越多以及不均衡,即使一开始每个Regio ...

  7. hbase源码系列(一)Balancer 负载均衡

    看源码很久了,终于开始动手写博客了,为什么是先写负载均衡呢,因为一个室友入职新公司了,然后他们遇到这方面的问题,某些机器的硬盘使用明显比别的机器要多,每次用hadoop做完负载均衡,很快又变回来了. ...

  8. zookeeper 负载均衡 核心机制-实现原理 包含ZAB协议(滴滴,阿里面试)

    面试也经常问kafka的原理,以及zookeeper与kafka原理的区别:kafka 数据一致性-leader,follower机制与zookeeper的区别: zookeeper是如何实现负载均衡 ...

  9. 手把手带你利用Ribbon实现客户端的负载均衡

    之前的文章<SpringCloud搭建注册中心与服务注册>介绍了注册中心的搭建和服务的注册,本文将介绍下服务消费者通过Ribbon调用服务实现负载均衡的过程. 本文目录 一.Ribbon服 ...

随机推荐

  1. litespeed 下配置 伪静态,反向代理

    <IfModule mod_rewrite.c>RewriteEngine onRewriteBase / RewriteRule ^(.*).html$ index.php?static ...

  2. NMS—卷积神经网络

    1-传统的NMS NMS,非极大值抑制,在很多计算机视觉问题中有着重要应用,尤其是目标检测领域. 以人脸检测为例,通常的流程为3步: (1)通过滑动窗口或者其它的object proposals方法产 ...

  3. CART树

    算法概述 CART(Classification And Regression Tree)算法是一种决策树分类方法. 它采用一种二分递归分割的技术,分割方法采用基于最小距离的基尼指数估计函数,将当前的 ...

  4. 反转ListBox的ListBoxItem(控件级别,不是数据的反转)

    在默认的排序下,当将ListBoxItem往下移动时,ListBoxItem是从其他ListBoxItem的底部移动的如下图:   但当往上移动时,情况则不是如此,     所以需要尝试对ListBo ...

  5. [转]ASP.NET Core配置环境变量和启动设置

    本文转自:https://www.cnblogs.com/tdfblog/p/Environments-LaunchSettings-in-Asp-Net-Core.html 在这一部分内容中,我们来 ...

  6. AspxGridView中行的双击事件

    ClientSideEvents-RowDblClick="clike" function clike(s, e) {           grdList.GetRowKey(e. ...

  7. 写给创业者:如何打造让用户离不开的App

    百度权重查询 词库网 网站监控 服务器监控 SEO监控 Swift编程语言教程 还记得那个学会编程,开发了一个拼车应用程序——Trees For Cars,并因此发了一笔小财的流浪汉吗?今天的新闻称, ...

  8. linux命令新建文件

    在命令行输入vi filename就创建了一个叫filename的文件了,如果存在就打开了. 进入vi以后,输入内容,最后按一下esc,再按冒号,输入wq就保存退出了. 新建一个文本文件 vi New ...

  9. CALayer及其子类

    前言:这个系列要更新Core Animation的内容,但是CALayer是Core Animation的基础. 一 CALayer是什么? 摘自官网的一句话-Layers Provide the B ...

  10. 使用postman测试接口时需要先登录怎么办

    原文 1.在浏览器上先登录,登录成功后获取cookie: 2.接着打开postman: