HMBASE的REGION分配

本文详细介绍了HBase启动时的meta和userregion分配过程,包括HMaster和RegionServer的角色,以及RS下线时的处理。重点讨论了meta region的splitlog操作、日志重播和region状态转换。此外,还涵盖了用户region的分配策略和RegionServer中的openRegion处理流程。
摘要由CSDN通过智能技术生成

HMBASEREGION分配

Region assign分为meta的分配与userregion assign,同时包含hbase启动时与rs下线,因此从4个方面来说明regionassign

启动时的metaregion assign

针对master启动时的补充说明:

Hmaster.run.finishInitialization方法中:

得到WALs目录下所有子目录,如果WALs目录下的日志目录的名称为ServerName-splitting,去掉-splitting部分

log目录格式:hdfs://<namenode>/hbase/WALs/<servername>-splitting/...

orhdfs://<namenode>/hbase/WALs/<servername>/...

取出日志目录的ServerName,检查现在masterServerManager.onlineServers中不包含的ServerName,

并返回这些个ServerName列表

通过hbase.hlog.split.skip.errors配置如果在加载log目录时出现错误(IOException)是否跳过重试,

默认为false,也就是需要重试

通过hbase.hlog.split.failure.retry.interval配置重试的间隔,默认为30*1000ms

主要作用metaregion log split

Set<ServerName>previouslyFailedServers= this.fileSystemManager

.getFailedServersFromLogFolders();


//remove stale recovering regions from previous run

通过SplitLogManagerzk中的路径下删除过期的replay日志路径

如果分布式日志重播hbase.master.distributed.log.replay配置为false,

直接删除recovering-regions路径(zookeeper.znode.recovering.regions配置)下的内容,

并结束此方法调用

如果分布式日志重播hbase.master.distributed.log.replay配置为true,

得到zookeeper.znode.splitlog配置的路径下的所有子路径(存放的是splittask名称),默认为splitWAL

每一个splittask的任务名称的最后一个”/”线后面部分是WALsServerNameURLDecoder.encode

读取并检查子路径下的内容,转换成SplitLogTask任务检查是否ZooKeeperProtos.SplitLogTask.State.DONE状态

如果不是,把此splittask对应的ServerName添加到方法开始时定义的列表中

读取recovering-regions路径(zookeeper.znode.recovering.regions配置)下的所有子路径,

每一个子路径通过regionencodename命名,同时检查每一个region下是否包含没重播日志的server子路径

检查没重播日志的server是否在刚才记录的servers

(调用此方法传入的servers(未启动)splittaskDONE状态的servers)中,

如果不包含,删除此regionsplitlog路径,并同时删除下面的子路径

this.fileSystemManager.removeStaleRecoveringRegionsFromZK(previouslyFailedServers);


//log splitting for hbase:meta server

通过metaRegionTracker在配置zookeeper.znode.metaserver的路径下

(默认meta-region-server)得到上一次metaregion运行的servername,

如果servername不为空(也就是cluster不是第一次运行),同时未启动的server列表中包含上一次运动的server

metaregion进行splitlog操作

splitlog先检查分布式日志重播hbase.master.distributed.log.replay配置,

如果配置为true,recovering-regions路径(zookeeper.znode.recovering.regions配置)

并在路径下创建此metaregionencodename的子路径,

同时在region子路径下把上一次运行metaregionserver也创建为子路径

示例:1->/hbase/recovering-regions/regionname,2->/hbase/recovering-regions/regionname/servername

如果配置为false,首先得到/hbase/WALs/servername路径重命名为/hbase/WALs/servername-splitting

zookeeper.znode.splitlog配置的路径下,默认为splitWAL,生成servername-splitting子路径

并在生成的路径下写入生成的SplitLogTask数据,

SplitLogManager.tasks中添加到一个Task,keysplitlogpath,value为此task,

同时在SplitLogManager.deadWorkers中添加此server(要做splitlog),等待task执行完成,

针对split的具体分析请点击查看hbasereplay分析

ServerName oldMetaServerLocation= this.catalogTracker.getMetaLocation();

if(oldMetaServerLocation!= null&& previouslyFailedServers.contains(oldMetaServerLocation)){

splitMetaLogBeforeAssignment(oldMetaServerLocation);

//Note: we can't remove oldMetaServerLocation frompreviousFailedServers list because it

//may also host user regions

}

得到recovering-regions路径(zookeeper.znode.recovering.regions配置)下的metaregion的所有server

这些server表示需要日志重播,针对metaregion,主要作用在对metalogsplit

Set<ServerName>previouslyFailedMetaRSs= getPreviouselyFailedMetaServersFromZK();


this.initializationBeforeMetaAssignment= true;


//initializeload balancer

初始化loadbalancer

this.balancer.setClusterStatus(getClusterStatus());

this.balancer.setMasterServices(this);

this.balancer.initialize();


//Make sure meta assigned before proceeding.

status.setStatus("AssigningMeta Region");

执行metaassign操作

assignMeta(status);



Hmaster启动时执行metaassign

启动时hmaster.run.finishInitialization调用assignMeta方法



voidassignMeta(MonitoredTaskstatus)

throwsInterruptedException, IOException, KeeperException {

//Work on meta region

通过hbase.catalog.verification.timeout配置超时时间,默认为1000ms

intassigned =0;

longtimeout =this.conf.getLong("hbase.catalog.verification.timeout",1000);

status.setStatus("Assigninghbase:meta region");

ServerNamelogReplayFailedMetaServer= null;


得到AssignmentManager中生成的RegionStates实例,此实例中保存所有region的相关状态

RegionStates regionStates= assignmentManager.getRegionStates();


添加metaregionregionStates中,设置metaregion的状态为offline或者split(如果需要split)

regionStates.createRegionState(HRegionInfo.FIRST_META_REGIONINFO);



第一步:

执行processRegionInTransition

通过zookeeper.znode.unassigned配置的路径,默认为region-in-transition

检查region是否在此路径下存在子路径,不存在表示region不需要事物处理,直接返回方法调用返回false,

否则执行如下流程:

此时表示/hbase/region-in-transition/region-name有值,取出路径下的值,转换成RegionTransition对象

检查regionStates中的regionsInTransition列表中是否已经包含此region

如果包含表示region

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值