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服务