Region
分配
HBase
的
cluster
中,
Region
是如何分配这个问题,困扰了我很久,经过代码分析和调试,得出了一些见解,缺点和错误请大家批评指正。
参与
Region
分配的重要对象
在
Region
分配过程中,起着重要作用有如下一些对象。
-
HMaster—
是
HBase
中的
Master server
,仅有一个。
-
HRegionServer---
负责多个
HRegion
使之能向
client
端提供服务,在
HBase cluster
中存在多个
HRegionServer
。
-
ServerManager---
负责管理
Region server
信息,比如每个
Region server
的
HServerInfo(
这个对象包含
HServerAddress
和
startCode),
已
load Region
个数,死亡的
Region server
列表
-
RegionManager
---
负责将
region
分配到
region
server
的具体工作,还有监视
root
和
meta
这
2
个特殊
region
的状态。
-
RootScanner
---
定期扫描
root region
,以发现没有分配的
meta region
。
-
MetaScanner---
定期扫描
meta region,
以发现没有分配的
user region
。
这些对象的关系如图所示:
Region
分配过程
HMaster
起动时,首先会通过
RegionManager
把
rootRegionLocation
(里面包含
HServerAddress
)的值置为
null
,然后把
root region
从待处理
region
列表中移除(如果有的话),然后重新将其放入待处理
region
列表(
regionsInTransition
),并将其状态设置为
UNASSIGNED(
未分配
).
当一个
Region server
启动完成时,它会调用
reportForDuty
函数向
HMaster
报告它的启动,报告当然是通过
HMasterRegionInterface
的
regionServerStartup
方法。然后
HMaster
会把
Region server
的报告转交给
ServerManager
的
regionServerStartup
方法处理。
ServerManager
会将这个新的
RegionServer
加入
region server
列表并且把它的
server load
设为空闲的。
RegionServer
会定期发送报告给
HMaster
,请求
HMaster
进一步的指示。发送报告是通过
HMasterRegionInterface
的
regionServerReport
方法。
HMaster
接到报告后,移交报告给
ServerManager
的
regionServerReport
方法处理。
ServerManager
会查询
regionServer
的状态,得到一个
HServerInfo
对像,然后检查
RegionServer
是否为正常的。如果为正常的话,
ServerManager
会查询
regionserver
的负载(
HServerLoad
),更新一个
loadToServers
的
map
。然后进入
ServerManager
的
processMsgs
函数处理。
ServerManager
会检查该
regionServer
的已经打开的
region
的数目,如果打开的
region
数目少于一个固定的值(对应配置文件中的
hbase.regions.nobalancing.count
),然后就会调用
RegionManager
的
assignRegions
方法。
RegionManager
会向
ServerManager
查询,现在已启动的
RegionServer
有几个,如果只有一个的话,会做特别处理。
然后
RegionManager
调用自己的
regionsAwaitingAssignment
方法去取得等待分配的
region
集合。它先会特别考虑
root region
,如果它查到
root region
尚未被分配,它会马上返回只包含
root region
的集合。
如果没有任何
region
未分配的话而且并未处在安全模式,
RegionManager
会让
loadBalancer
执行负载均衡的动作(就是可能把该
regionserver
负责的
region
分一点出去)。
反之如果有待分配的
region
,
serverManager
会调用自己的
assignRegionsToMultipleServers
方法。
在
assignRegionsToMultipleServers
中,参数
regionsToAssign
是所有待分配的
region
集合,因为存在多个
regionServer,
所以
regionManager
会考虑到多个
regionServer
的负载。
regionManager
会先调用
regionsToGiveOtherServers
方法,求出其他
regionServer
(比如相对负载较轻的)应该承载的
region
数目,那么当前
regionServer
可能承载的
region
个数就是待分配的
region
总数目减去其他
regionServer
应该承载的
region
数目,这个数量我们暂称之为
N
。如果
N<=0
并且
Meta Region
如果已被分配的话,该
regionServer
会被略过,不会被要求承载
region
。因为比当前
regionServer
的负载轻的
regionServer
个数超过了待分配的
region
个数,轮不到当前的
regionServer
。
看起来快水落石出了,但是剩下事情还有点复杂。
regionManager
还会调用
computeNextHeaviestLoad
方法,算出
cluster
中有多少
regionServer
超过当前的
regionServer
,这个数目我们暂称之为
NS
,同时该方法会抓出负载最重的
server
的负载。
接着
regionManager
会求出当前
regionServer
负责的
region
数目和负载最重的
regionServer
负责的
region
数目之间的差值。如果这个差值大于
N
,那么
N
个
region
将全部会交由当前
regionServer
负责。反之这个差值小于N,如果
NS
大于零,当前
regionServer
要被分配的
region
数量为
(int)Math.ceil(1.0*N/1.0*NS),
如果
NS
等于零,那么当前
regionServer
要被分配
region
的数量为
(int)Math.ceil(1.0*N/1.0*regionServer
总数
)
。
然后
root region
就会被分配到该
RegionServer
上。
这里特别要提下:如果有多个
region serve
存在,
HBase
不会把
root region
和
meta region
分配到一个
RegionServer
上。
一旦
root region
被分配完成,
RootScanner
线程将被唤醒。然后它会
scan root region
。
在
scan
过程中,碰到每个
meta
region
条目,它会调用
checkAssigned
函数检查,改
meta region
是否被分配,如果没有的话,
regionManager
将会记录之,把该
region
加入待分配的
region
列表中。
一旦有
RegionServer
定期报告来了,
meta region
会像
root region
一样的方式被分配。
一旦
meta region
被分配完成,
MetaScanner
将被唤醒,然后它会
scan
meta region
。
在
scan
过程中,碰到每个
user region
条目,它会调用
checkAssigned
函数检查,该
user region
是否被分配,如果没有的话,
regionManager
将会记录之,把该
region
加入待分配的
region
列表中。
一旦有
RegionServer
定期报告来了,
user region
会被分配。
- 大小: 16.5 KB
分享到:
相关推荐
HMaster是HBase的管理节点,负责Region的分配、RegionServer的监控和故障恢复。每当HMaster检测到不平衡的Region分布,它就会启动balancer策略。 对于源码探索,我们可以查看HBase的源代码仓库,如Apache HBase的...
此外,HBase的Master节点是整个系统的管理者,`org.apache.hadoop.hbase.master.HMaster`类负责Region的分配、RegionServer的监控和故障恢复。通过分析`org.apache.hadoop.hbase.masterAssignment.RegionStates`和`...
Master负责全局的表管理和 Region分配,而RegionServer则负责实际的数据存储和处理。这种设计保证了系统的高可用性和扩展性。 2. HBase的数据模型 HBase中的数据以行(Row)和列族(Column Family)的形式组织,每...
- 探索优化策略,如Region分配策略、数据缓存机制等。 - 自定义扩展,满足特定业务需求,如开发自定义过滤器、Region分裂策略等。 通过对HBase 1.3.6源码的学习和研究,开发者不仅可以掌握HBase的基本操作,还能...
Master节点负责表的元数据管理、Region分配和集群监控,而RegionServer则是数据存储和处理的主体。理解这些组件的工作原理对于优化HBase性能至关重要。 此外,书中还会探讨HBase的数据模型,包括行键(Row Key)的...
Master节点负责Region的分配和管理,ZooKeeper则提供高可用性和故障恢复。此外,HBase还支持时间戳,每个数据项都有多个版本,可以根据需要保留历史记录或进行版本控制。 对于开发人员来说,理解HBase的API和查询...
《Linux环境下HBase 2.3.2客户端的探索与应用》 HBase,作为Apache软件基金会的一个开源项目,是构建在Hadoop分布式文件系统(HDFS)之上的分布式、面向列的数据库,专为大数据设计,支持海量数据的实时读写。在...
1. Master节点:负责表和Region的管理,包括 Region分配、Region分裂和Region移动等操作。同时,它还监控RegionServer的状态,确保集群的高可用性。 2. RegionServer节点:实际存储数据的地方,每个RegionServer...
1. **Region一致性**:确保每个region都正确地分配并部署到唯一的RegionServer上,且在内存、hbase:meta表和Zookeeper中的状态一致。 2. **表完整性**:检查每张表的rowkey分布,确保rowkey不会存在于多个region区间...
《深入理解大数据技术:HBase探索》 HBase,全称为Hadoop Database,是一种基于Apache Hadoop生态系统的分布式、高性能、可扩展的NoSQL数据库。它专为处理大规模数据而设计,尤其适用于实时读写场景,是大数据领域...
HMaster负责区域分配、元数据管理以及故障恢复,RegionServer则处理数据存储和用户请求。 **4. 数据模型** - **行键(Row Key)**:HBase中的数据是按行键排序的,行键是不可分割的字节数组,决定了数据的存储位置...
HBase 采用了 Master/RegionServer 的架构模型,其中 Master 负责管理 RegionServer 并分配数据区域(Region)。每个 RegionServer 负责处理特定区域的数据读写请求,并将数据存储在 DataNodes 上。 **Phoenix 架构...
Master服务器在HBase中扮演着重要角色,它负责RegionServer的监控、Region的分配和平衡、以及元数据的管理。源码中,`org.apache.hadoop.hbase.master.HMaster`是Master的主要实现类,包含了一系列的管理服务。 总...
7. **Region负载均衡**:高级的Region分配算法,适应多应用、多用户的场景。 8. **HBase复制控制**:精细控制不同表和列族的复制份数,以优化资源利用。 【南京大学研究进展】 黄宜华教授领导的研究团队在大数据...
3. **一致性哈希算法**:通过计算哈希值来确定数据存储的位置,支持动态添加或删除节点而无需重新分配所有数据。 4. **云计算的服务类型**:基础设施即服务(IaaS)、平台即服务(PaaS)、软件即服务(SaaS)。 5. *...