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 分配过程
- Root 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 上。
- Meta region 的分配
一旦 root region 被分配完成, RootScanner 线程将被唤醒。然后它会 scan root region 。
在 scan 过程中,碰到每个 meta region 条目,它会调用 checkAssigned 函数检查,改 meta region 是否被分配,如果没有的话, regionManager 将会记录之,把该 region 加入待分配的 region 列表中。
一旦有 RegionServer 定期报告来了, meta region 会像 root region 一样的方式被分配。
- User region 的分配
一旦 meta region 被分配完成, MetaScanner 将被唤醒,然后它会 scan meta region 。
在 scan 过程中,碰到每个 user region 条目,它会调用 checkAssigned 函数检查,该 user region 是否被分配,如果没有的话, regionManager 将会记录之,把该 region 加入待分配的 region 列表中。
一旦有 RegionServer 定期报告来了, user region 会被分配。
相关推荐
【HBASERegion数量增多问题描述及解决方案】 在HBase分布式数据库中,Region是表数据的基本存储单元,它将表的数据按照ROWKEY的范围进行分割。随着数据的增长,一个Region会分裂成两个,以此来确保数据的均衡分布。...
分区,或者说Region,是HBase存储数据的基本单位。每个Region包含一个或多个表的行键范围,确保数据的分散存储,从而提高查询效率。当我们谈论"Hbase分区merge和split操作"时,我们指的是管理员或开发人员对Region...
1. Region服务器:存储HBase表的分区,负责处理表的读写请求。 2. Master节点:管理Region服务器,处理表和Region的分配,监控服务器健康状态,进行Region分裂和合并操作。 3. ZooKeeper:协调HBase集群,提供服务...
预分区(Pre-Partitioning)是HBase为了优化性能和负载均衡而采用的一种策略,主要解决的是数据写入的热点问题以及减少Region分裂带来的开销。 在HBase中,Region是数据存储的基本单元,每个Region包含一个或多个...
HBase中的Region可以理解为关系型数据库中的“分区”,每个Region负责存储表中一部分数据的请求处理。最初,每个表只有一个Region,随着数据的增加,Region会不断增大,当增大到一个阈值时,Region会被等分成两个新...
此外,HBase的Master节点是整个系统的管理者,`org.apache.hadoop.hbase.master.HMaster`类负责Region的分配、RegionServer的监控和故障恢复。通过分析`org.apache.hadoop.hbase.masterAssignment.RegionStates`和`...
11. **数据分区与负载均衡**:Region是HBase中的基本分区单位,随着数据增长,一个Region会分裂成两个,以确保性能。HMaster负责Region的分配,确保负载均衡。 12. **监控与管理**:HBase提供了丰富的监控工具,如...
客户端还需要处理 Region 分区和重定向,以确保数据被正确地读写到相应的 Region。 **配置文件 hbase-site.xml** `hbase-site.xml` 是 HBase 配置文件,用于定义集群的各种属性,如 ZooKeeper 地址、HBase 的根...
- ** Region 分区**:HBase通过Region进行数据分区,Region会根据行键自动划分,随着数据增长,Region会分裂以保持性能。 - **Zookeeper角色**:Zookeeper用于协调集群状态,管理Master选举和RegionServer的注册。...
4. Region:数据分区单位,随着数据量增长,Region会自动分裂。 三、HBase功能特性 1. 实时读写:HBase支持毫秒级的读写速度,适合实时数据分析场景。 2. 强一致性和高可用性:通过WAL(Write-Ahead Log)和HLog...
2. 分布式:HBase通过分区(Region)将数据分散在多台服务器上,可以水平扩展,处理大量数据。 3. 行键有序:HBase中的行是根据行键(Row Key)排序的,这有利于范围查询和扫描操作。 4. 实时读写:HBase提供了...
5. **Region**:Region是HBase的逻辑数据分区,由一个或多个列族组成。每个Region有唯一的开始和结束键,这些键定义了该Region的数据范围。 6. **Column Family**:列族是数据的物理存储单位,每个列族下可以有任意...
6. **Region**:Region是表的逻辑分区,每个Region包含一个或多个列族,Region会随着数据的增长自动分裂。 7. **Region Server**:Region Server是HBase的主要工作节点,负责Region的存储和管理,包括读写操作。 8. ...
2. **表的预分区**:为了优化数据写入,开发者可以在创建表时预先定义Region的数量和边界,这称为预分区。这样可以避免数据集中写入某一区域,导致热点现象。 3. **HBase的Compaction**:Compaction是HBase中用于...
数据分区与分布**:为了支持大规模数据的高效处理,HBase使用Region的概念对表进行水平分割。每个Region包含一定范围的行键,并且可以在不同的RegionServer之间迁移,以实现负载均衡。 **3. 数据压缩与缓存**:...
随着数据量的增长,一个表会被划分成多个Region,每个Region由一个范围(start key, end key]表示,并且会被分配到不同的Region Server上进行管理。 - **-ROOT- Table**: 存储.META.表的位置信息。 - **.META. ...
HBase是Apache Hadoop生态系统中的一个分布式、版本化、列族式存储系统,设计用于处理大规模数据集。这个“hbase-2.4.17-bin”安装包提供了HBase的最新稳定版本2.4.17,适用于大数据处理和分析场景。下面将详细介绍...
4. **自动分区**:HBase能够自动将数据分区到新的节点,实现线性扩展。 5. **负载均衡**:通过RegionServer,HBase可以实现区域的自动再平衡,保持集群的稳定运行。 HBase解决了传统关系型数据库在扩展性和实时性上...
6. **数据分区与分布**:HBase通过Region进行数据分区,Region会随着数据增长而分裂。Region Server根据行键范围管理Region,确保数据均匀分布在集群中。 7. **索引和查询优化**:HBase默认没有复杂的查询功能,...
HBase中的多个HMaster通过Zookeeper的Master Election机制来确定主HMaster,主HMaster负责管理表和Region的生命周期,包括表的创建、删除、分区以及Region的迁移等。 HRegionServer是HBase的核心组件,它们直接处理...