HBase源码阅读-2-HMaster

2.HMaster:实现master的功能

A.负责分配region到regionserver,检测新增或失败的regionserver,与regionserver交互,regionserver间的负载均衡等;

B.处理shcema的变更;

C.实现ZooKeeper的Watcher接口,与zookeeper集群交互

2.1master启动过程初始化,构造HMaster实例

--minServers=:指定最少的RegionServers数,默认为13,(RegionServer机器不够13如何??)

根据参数hbase.cluster.distributed分local和distribute模式,这里主要考虑distribute模式下:

(1)设置并检查文件系统路径。(checkRootDir方法)

a.如果文件系统处于安全模型,则一直等待直到退出安全模式

b.若root路径不存在则会创建该目录,并将当前hbase的文件格式版本号写入hbase.version中,并再下一次启动是会检查

是否与当前hbase版本支持的文件格式版本一致。

c.检查rootRegion是否存在,即-ROOT-目录是否存在(rootregion也是当做一个table来统一处理的)。

不存在,则创建rootregion和第1个metaregion。

rootregion:regionId=0,tableName=-ROOT-,仅有一个info的ColumnFamily

metaregion:regionId=1,tableName=.META.,有一个info和historian两个ColumnFamily

d.将meta做为rootregion的userregion加入其中(有点拗口)。

(2)获取master的地址,并创建一个HBaseServer的实例提供RPC服务

(3)创建一个连接???(HMaster也作为集群的一个客户端,完成schema的变更等功能)

(4)读取classpath下配置的hbase.zookeeper.property.clientPort和hbase.zookeeper.quorum,连接zookeeper集群:创建ZooKeeper实例,并增加Watcher(HMaster)

设置/hbase,/hbase/root-region-server,/hbase/rs,/hbase/master,/hbase/master/shutdown等hbase存储在zookeeper中信息的路径

将master地址写入/hbase/master(若该Znode存在,则等待直到该节点被删除。谁来删???)

(5)建立RegionServerOperation队列

(6)启动ServerManager管理regionservers的信息

(7)启动RegionManager分配region到regionservers,并管理root,meta等状态

2.2master执行过程,启动线程,执行Thread.run()

(1)将master加入集群:

从zookeeper的hbase/root-region-server读取rootregion所在的regionserver;

读取所有regionserver地址,若没有regionserver则可能是一个新启动的集群,调用HLog.splitLog(this.rootdir,logDir,oldLogDir,this.fs,getConfiguration())(还没看明白???);

(2)启动服务线程:

启动RegionManager的root和metaregion的扫描线程

初始扫描后,应知道所有region的分配信息;而region每次分裂后也应通知master,并分配region给新的regionserver;

但master可能丢失该split信息,因此周期性的扫描root和metaregion以检测丢失的split信息及regionserver的死亡信息

启动一个JettyServer,处理http请求

启动RPC服务

相关推荐