1、Zookeeperwatcher:在初始化时,把所有的zookeeper上的baseNode下的节点(root-region-server,rs,draining,master,backup-masters,shutdown,unassigned,table,hbaseid,splitlog)都创建了,初始化时不带watch。
在适当的时机,对这些节点创建watcher,监控他们的子节点的变化,当这些子节点变化时,zookeeperwatcher监听这些事件,进而执行listener list。
2、ActiveMasterManager:zookeeper上的master节点变动的监听器,用于产生新的master。
3、AssignmentManager:对region进行管理分配,监听zookeeper上unassigned下节点的变化;
Region的状态,
public enum State {
OFFLINE, // region is in an offline state
PENDING_OPEN, // sent rpc to server to open but has not begun
OPENING, // server has begun to open but not yet done
OPEN, // server opened region and updated meta
PENDING_CLOSE, // sent rpc to server to close but has not begun
CLOSING, // server has begun to close but not yet done
CLOSED, // server closed region and updated meta
SPLITTING, // server started split of a region
SPLIT // server completed split of a region
}
在这个类中保存有所有region的过渡状态regionsInTransition;保存server到region的映射;region到server的映射;
zookeeper的unassigned节点,其子节点表示未分配的region(HMaster启动后,扫描HDFS中ROOT,META表,把所有的region放在这个节点下,待分配)
子节点的监听处理过程如下,
子节点的值为RegionTransitionData,节点创建或者对这个节点的值赋值的处理措施,
1)master设置这个region下线(create)
2)RegionServer已经开启了region split(set data)
regionState首先是出于splitting状态,然后置RegionSate为offline。
3)region split已经完成了(set data)
根据节点的值获知当前节点的daughters,由多线程服务并发split后续的处理SplitRegionHandler
this.executorService.submit(new SplitRegionHandler(master, this,
regionState.getRegion(), sn, daughters));
4)master设置这个region为closing状态(create data)
设置regionState为closing状态
5)RegionServer已经close了region(set data)
后续的处理ClosedRegionHandler
new ClosedRegionHandler(master, this, regionState.getRegion())
.process();
this.executorService.submit(new ClosedRegionHandler(master,
this, regionState.getRegion()));
6)RegionServer打开region失败(set data)
关闭region
this.executorService.submit(new ClosedRegionHandler(master,
this, regionState.getRegion()));
7)RegionServer在打开region的过程中(set data)
设置regionState为打开状态
8)RegionServer已经完成打开了一个region(set data)
this.executorService.submit(
new OpenedRegionHandler(master, this, regionState.getRegion(),
data.getOrigin(), expectedVersion));
当节点删除时,如果当前该region处于transtion过程中,则把这个region下线。
Assign一个region的过程,
void assign(final ServerName destination,
final List<HRegionInfo> regions)
设置该region in transition状态
region下线
生成分配计划
RPC通知server打开这个region
this.serverManager.sendRegionOpen(destination, regions);
Unassign一个region的过程,
设置region in transition状态
RPC通知对应server关闭该region
serverManager.sendRegionClose(server, state.getRegion(),versionOfClosingNode)
4、
BulkAssigner:批量多线程方式assign,unassign,调用AssignManager,用于集群启动的场景
5、
BulkReopen:批量重新打开region,继承BulkAssigner
6、
CatalogJanitor:作为HMaster服务的一个catalog table的守护者(chore),定期扫描.META表,垃圾回收unused的region,主要是分裂后产生的 parent regions,从META表和文件系统彻底删除。
7、
LoadBalancer:region在server之间的的放置和移动,可以有两个方式进行启动balance,一个是admin接口,一个是作由为日常的事物,集群定时启动balance(当前集群无region处于transie stion状态);Balancer产生一些执行计划AssignmentManager来执行。
8、
LogCleaner:作为HMaster服务的log 清除的守护者(chore),氢气清除HLog
9、
ServerManager:
维护在线的、dead的、dranning的server列表;
到他们的连接接口HRegionInstance;
各个server的load情况;
使server过期、下线;
通过rpc打开在server中打开或者关闭一个region;
关闭集群
10、SplitLogManager:
SplitLogManager:在server宕机后,SplitLogManager对log进行split,并在/hbase/splitlog下创建节点。比如rs1宕掉,在zookeeper上的/hbase/splitlog下创建task(节点名称为log文件名称),进而提交task任务,由RegionServer端的SplitLogWork进行竞争;SplitLogManager有一个timeoutMonitor线程监控znodes的,如果任务进行的时间比较长,那么就从SplitLogWork收回task,任务进入重新竞争;
task完成后,由SplitLogManager删除znode。.logs/rs1;/xxxxx1,.logs/rs1/xxxxx2 这些日志文件作为需要split的WAL日志文件。
在region server中有woker线程(SplitLogWorkers)领取任务《锁住》,对该文件进行拆分,按照region分组,拆分到HDFS中的regioninfo下
在server关闭之前,ServerShutdownHandler.process对log进行split,
this.services.getMasterFileSystem().splitLog(serverName);
----SplitLogManager.splitLogDistributed(logDirs);
----SplitLogManager.enqueueSplitTask(String taskname, TaskBatch batch)<* Add a task entry to splitlog znode if it is not already there.>
在zookeeper上的/hbase/splitlog/增加节点后,由regionserver上的SplitLogWorker(竞争的去获取task)进行监听,并处理。
11、HMaster:
启动过程,
1)竞争性的创建master节点,变为ActiveMaster,如果不能成功创建master节点,则变为backup节点,循环调用ActiveMasterManager.blockUntilBecomingActiveMaster)直到可以成功创建master节点。
2)初始化HMaster,包括
初始化MasterFileSystem,
发布ClusterID到zookeeper节点上,
初始化ExecutorService pool设置,
ServerManager的初始化,
初始化一些基于zookeeper的系统tracker,包括(catalogTracker,balancer,assignmentManager,regionServerTracker,drainingServerTracker)
初始化 master coprocessors,
启动 master service threads(executorService,logCleaner,infoServer,infoServer),其中executorService包括
// Master executor services
MASTER_CLOSE_REGION (1),
MASTER_OPEN_REGION (2),
MASTER_SERVER_OPERATIONS (3),
MASTER_TABLE_OPERATIONS (4),
MASTER_RS_SHUTDOWN (5),
MASTER_META_SERVER_OPERATIONS (6),
3)等待regionserver来汇报,这里是阻塞的
4)log恢复split logs
5)分配root和meta表到regionServer
6)启动定时任务chore(balancerChore,catalogJanitorChore)
停止过程,
1)停止一些定时跑的进程(balancerChore,catalogJanitorChore)
2)
待完善......