hbase是基于列族存储,列族下面有很多的列,
hbase一张表可以特别大,可以有多个列族,每个列族中又有多个列,由于一张表存储的数据量比较多,所以就把一张表横向拆分多个region进行存储,一台节点就是一个regionserver,一张表的不同region可以存储在不同的regionserver中,同时,在一个region中又存在不同的列族,每个列族又存着不同的列,一个列族横向只对应着一个hfile,竖向对应着多个hfile和region,
- 一个hregionserver里有多个hregion,多个hregion共享一个hlog,一台机器上只有一个hlog
- 一个hregion是对一个大表进行水平上的切分,一个hregion里有多个hstore
- 一个hstore里面包含了一个或者多个storefile,一个menstore
- 一个storefile对应着一个hfile,一个hfile就保存着一个列族的数据
- hbase’的namespace相当于mysql一个库,映射到hdfs上就是一个文件夹
Hbase会通过zookeeper选举出hmaster,
hmaster的线程loadbalancer负责各regionserver的负责均衡,通过移动region.
slop 在StochasticLoadBalance的slop值为0.001,在其他负载均衡器如simpleloadbalancer是 0.2,也就是当
hbase.regions.slop Description
Rebalance if any regionserver has average + (average * slop) regions. The
default value of this parameter is 0.001 in StochasticLoadBalancer
(the default load balancer), while the default is 0.2 in other load
balancers (i.e., SimpleLoadBalancer).
Default 0.001*
hbase动态动态均衡实现策略,系统默认如果max(region)>cell(avg(region)) ||
min(region)<floor(avg(region),即有一台regionserver的region数目比平均每台server的region向上取整还大,或者有一台regionserver的region数目比平均每台server的region向下取整还小,就执行均衡策略,每五分钟检查一次.
从server的region数目比cell(avg(region)大的server上,把region的数目取到和这个值相等,然后在向cell(avg(region)小的server上分配,将其数目增加到cell(avg(region)这个数目,因此可能会出现三种情况
1.多余的region分配完后,所有的region刚好不比floor小,且不比cell大,合格
2.分配完后,仍然有机器的region数目低于floor值,但仍有region已经分配完,这时候从max的机器上取一个region,向低于floor的机器上分配,此时如果没有分配完,就向floor上分配
3.分配完后,所有的都>=floor,但是没有分配完,就向floor上继续分配
一. 如果有region数量为1 5 5,三台机器,平均数为3.6,floor值为3.cell值为4,从region为5的机器上各取一个一共两个,向低于floor的机器上分配,分配完后,各机器状态为3,4,4,满足条件
二.如果有数量为1,6,6的三台机器,avg=4.3,floor=4,cell=5,从2号,3号机器各取1个,一共两个,开始分配分配后是,3,5,5,已经分配完毕,但是第一台机器上的region数目仍然小于3,从cell上各取一个,此时集群状态为3,4,4待分配数目2,分配到1号一个,此时都是等于floor值,但是还有一个没有分配出去,剩下的那个直接分配到floor值上去即可
三.如果是1,3,10 avg=4.6,cell=5,floor=4,从三号机取5个,此时1,3,5待分配5个,分到1号机三个,分到二号机1个,此时4,4,5 还有一个没有分配出去,最后一个分配到floor上去即可