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
分享到:
相关推荐
HBASERegion数量增多问题描述及解决方案.docx
中国HBase技术社区第4届-MeetUp-上海站_基于HBase实时数仓探索实践.pptx
本文来自于36大数据,这篇文章将会对这些细节进行基本的说明,一方面可以让大家对HBase中Region自动切分有更加深入的理解,另一方面如果想实现类似的功能也可以参考HBase的实现方案。Region自动切分是HBase能够拥有...
大数据云存储HBase实践与探索.pptx
1、region 拆分机制 ...当region大小大于某个阈值(hbase.hregion.max.filesize=10G)之后就会触发切分,一个region等分为2个region。 但是在生产线上这种切分策略却有相当大的弊端:切分策略对于大表和小表没有
实时数据仓库构建,基于HBase存储构建实时的数据仓库系统技术
hbase-region-inspector, HBase区域统计信息的可视化仪表板 hbase-region-inspectorHBase区域统计信息的可视化仪表板。 用法下载与HBase集群版本匹配的可执行二进制插件,添加execute权限,并使用以下命令行参数启动...
hbase-packet-inspector hbase-packet-inspector (HPI)是用于分析HBase RegionServers网络流量的命令行工具。 HPI读取tcpdump文件或捕获网络接口的实时数据包流,以提取有关客户端请求和响应的信息。 您可以对其...
HBase入门与使用,可以了解如何使用HBase
介绍hbase 权限配置。
HBASE的主要原理解读:包括HBase 读写逻辑、HBase region拆分和合并
java 利用 sping-data-hadoop HbaseTemplate 操作hbase find get execute 等方法 可以直接运行
1-9+基于+HBase+实时数仓探索实践
搭建pinpoint需要的hbase初始化脚本hbase-create.hbase
2. 请简述HBase中数据写入最后导致Region分裂的全过程 3. 如果设计一个笔记的表,表中要求有笔记的属性和笔记的内容,怎么做 4. HBase部署时如何指定多个zookeeper 5. HBase shell是基于哪种JVM运行的语言实现的 6. ...
1. HBase有哪些基本的特征? 1 HBase特征: 1 2. HBase相对于关系数据库能解决的问题是什么? 2 HBase与关系数据的区别? 2 HBase与RDBMS的区别? 2 3. HBase的数据模式是怎么样的?即有哪些元素?如何存储?等 3 1...
HBase(hbase-2.4.9-bin.tar.gz)是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System...
HBase在苏宁的应用和实践.pdf
HBase开发实战,HBase学习利器:HBase实战