HMBASE的REGION分配
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,检查现在master的ServerManager.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
通过SplitLogManager在zk中的路径下删除过期的replay日志路径
如果分布式日志重播hbase.master.distributed.log.replay配置为false,
直接删除recovering-regions路径(zookeeper.znode.recovering.regions配置)下的内容,
并结束此方法调用
如果分布式日志重播hbase.master.distributed.log.replay配置为true,
得到zookeeper.znode.splitlog配置的路径下的所有子路径(存放的是split的task名称),默认为splitWAL
每一个splittask的任务名称的最后一个”/”线后面部分是WALs的ServerName的URLDecoder.encode值
读取并检查子路径下的内容,转换成SplitLogTask任务检查是否ZooKeeperProtos.SplitLogTask.State.DONE状态,
如果不是,把此splittask对应的ServerName添加到方法开始时定义的列表中
读取recovering-regions路径(zookeeper.znode.recovering.regions配置)下的所有子路径,
每一个子路径通过region的encodename命名,同时检查每一个region下是否包含没重播日志的server子路径
检查没重播日志的server是否在刚才记录的servers
(调用此方法传入的servers(未启动)与splittask非DONE状态的servers)中,
如果不包含,删除此region的splitlog路径,并同时删除下面的子路径
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配置)
并在路径下创建此metaregion的encodename的子路径,
同时在region子路径下把上一次运行metaregion的server也创建为子路径
示例: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,key为splitlog的path,value为此task,
同时在SplitLogManager.deadWorkers中添加此server(要做splitlog),等待task执行完成,
针对split的具体分析请点击查看hbase的replay分析
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的,主要作用在对meta的logsplit
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");
执行meta的assign操作
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();
添加metaregion到regionStates中,设置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