HBase源码分析之org.apache.hadoop.hbase.master包

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)
 
待完善......
 

 

你可能感兴趣的:(源代码,hbase)