首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

HBase源码翻阅-5-HMaster对HRegion的管理

2012-07-01 
HBase源码阅读-5-HMaster对HRegion的管理5.HMaster对HRegion的管理:master将region的分派,状态管理等工作

HBase源码阅读-5-HMaster对HRegion的管理

5.HMaster对HRegion的管理:master将region的分派,状态管理等工作委托给RegionManager
??? ??? (1)RegionManager成员变量:rootRegionLocation,root region所在regionserver地址;
??? ??? ??? ??? ??? ??? ??? rootScannerThread和MetaScanner,root及meta region的扫描线程;
??? ??? ??? ??? ??? ??? ??? numberOfMetaRegions,meta regions数量由rootScannerThread设置;
??? ??? ??? ??? ??? ??? ??? onlineMetaRegions,在线的meta regions
??? ??? ??? ??? ??? ??? ??? regionsInTransition,记录正在状态变化中的region,region的状态有:
??? ??? ??? ??? ??? ??? ??? ??? UNASSIGNED-等待分配到server
??? ??? ??? ??? ??? ??? ??? ??? PENDING_OPEN-告诉server打开,但还未完成
??? ??? ??? ??? ??? ??? ??? ??? OPEN-已打开region,但尚未在meta region中标识
??? ??? ??? ??? ??? ??? ??? ??? CLOSING-已将close msg放入队列中,但还尚未发送到regionserver
??? ??? ??? ??? ??? ??? ??? ??? PENDING_CLOSE-已将regionserver发送给regionserver
??? ??? ??? ??? ??? ??? ??? ??? CLOSED-已关闭region,但尚未在meta region中标识
??? ??? ??? ??? ??? ??? ??? maxAssignInOneGo,一次分配给一个regionserver的最多region数量
??? ??? ??? ??? ??? ??? ??? LoadBalancer,负责regionserver间负载均衡
??? ??? ??? ??? ??? ??? ??? regionsToSplit,regionsToCompact,regionsToMajorCompact,regionsToFlush,需split/compact/MajorCompact/Flush的region
??? ??? (2)RegionManager工作流程:
??? ??? ??? HMaster初始化时创建RegionManager实例;
??? ??? ??? 清除RegionManager中root region的地址及状态信息,设置root region状态为UNASSIGNED并加入regionsInTransition中;
??? ??? ??? HMaster启动各种后台服务时,RegionManager后台启动rootScannerThread和metaScannerThread线程;???
??? ??? ??? regionserver向master报告时,ServerManage在regionServerReport方法中调用RegionManager来处理跟region相关的msg.
??? ??? ???
??? ??? (3)RegionManager处理各种Region相关HMsg???
??? ??? ??? a.regionserver正在关闭
??? ??? ??? ??? RegionManager关闭该regionserver上的所有region,包括root,meta和user region,并对root meta和online的user regionr重新分配,对offline user region从regionsInTransition删除其状态信息
??? ??? ??? b.regionserver已open指定region
??? ??? ??? ??? RegionManager判断该region是否重复分配了,重复分配则返回关闭该region指令;
??? ??? ??? ??? 若open的是root region,则在master的ServerConnection和RegionManager中记录root region所在地址;
??? ??? ??? ??? 若open user region,具体操作参见ServerManager??? ???
??? ??? ??? c.regionserver已关闭指定region:
??? ??? ??? ??? 关闭root region:???
??? ??? ??? ??? 关闭meta region:从RegionManager的onlineMetaRegions中删除该region;
??? ??? ??? ??? regionsInTransition中设置该region为CLOSED;
??? ??? ??? ??? 向master的RegionServerOperationQueue中增加ProcessRegionClose操作:往meta中写入该region offline状态,或若该region需重新分配则RegionManager设置该region待分配状态
??? ??? ??? d.regionserver已split某个region:???
??? ??? ??? ??? 读取连续的后两条HMsg从中取出分裂产生的两个HRegionInfo;
??? ??? ??? ??? 从regionsToSplit和regionsToCompact中删除被分裂的HRegionInfo;
??? ??? ??? ??? 从onlineMetaRegions中查找应包含新region的meta region,并尝试从对应的regionserver中读取新region,若存在则不做处理,不存在则将新region设置成待分配状态;
??? ??? ??? ??? 若meta region被分裂,则从onlineMetaRegions中删除掉该region,并增加meta region的数量numberOfMetaRegions;
??? ??? ???
??? ??? (4)组织返回给regionserver的HMsg:
??? ??? ??? a.对一个标记为需Close的region,增加一条MSG_REGION_CLOSE的HMsg,并在中regionsInTransition设置其状态为PENDING_CLOSE
??? ??? ??? b.若正执行open region的数量少于hbase.regions.nobalancing.count指定的值,则从regionsInTransition中获取待分配的region(root region优先)???
??? ??? ??? c.若无region分配给该regionserver,则比较该regionserver的region负载数量和整个集群的平均负载+slop系数(由参数hbase.regions.slop指定),由一算法(balanceFromOverloaded和balanceToLowloaded方法)
??? ??? ??? ??? 计算该regionserver需close的region数量,并从负载最严重的region中选择指定数量的非root、meta region和不在regionsInTransition中的region,发出HMsg在该regionserver中close这些region,并设置状态为PENDING_CLOSE
??? ??? ??? d.综合考虑多个整个集群的负载,??? 将需分配的region分配到多个regionserver:
??? ??? ??? ??? 通过ServerManager找出负载最轻的那些regionserver,分摊一些region到这些regionserver;
??? ??? ??? ??? doRegionAssignment方法分配一个region到指定regionserver,设置状态状态为PENDING_OPEN,并发送MSG_REGION_OPEN消息;
??? ??? ??? e.从regionsToCompact,regionsToSplit,regionsToFlush,regionsToMajorCompact中获取需要执行对应操作的region并发送对应HMsg???
??? ??? ??? ???
??? ??? ??? ??? ??? ???
??? ??? (5)MetaScanner和RootScanner线程??? ??? ??? ???
??? ??? 这两个线程都继承自BaseScanner,通过初始化时扫描root和meta region可以知道所有的region并进行分配;当分裂一个region时,regionserver会通知master分配新region,但master可能
??? ??? 会丢失这些分裂信息,而新region通常没有regionserver的信息,因此周期性地扫描发现这些新region并进行分配。
??? ??? ??? a.RootScanner运行时机:master收到regionserver的root region被open指令;首次扫描后定期自动扫描
??? ??? ??? ??? 扫描过程描述:
??? ??? ??? ??? ??? 从RegionManager获取root region所在rs地址;
??? ??? ??? ??? ??? 通过master的ServerConnection获取HRegionInterface接口代理,遍历root region内所有meta region的记录;
??? ??? ??? ??? ??? 检查region对应的HServerInfo是否存在,不存在则表示尚未分配rs,加入到regionsInTransition,设置状态为UNASSIGNED;
??? ??? ??? ??? ??? 检查所有已分裂的parent,
??? ??? ??? ??? ???
??? ??? ??? b.MetaScanner运行时机:当一个meta region上线;定期自动扫描上线的meta region;扫描过程逻辑类似RootScanner

热点排行