读书人

HBase源码翻阅-2-HMaster

发布时间: 2012-08-27 21:21:57 作者: rapoo

HBase源码阅读-2-HMaster

2.HMaster:实现master的功能
A.负责分配region到regionserver,检测新增或失败的regionserver,与regionserver交互,regionserver间的负载均衡等;
B.处理shcema的变更;
C.实现ZooKeeper的Watcher接口,与zookeeper集群交互

??? ??? 2.1 master启动过程初始化,构造HMaster实例
??? ??? ??? --minServers=:指定最少的RegionServers数,默认为13,(RegionServer机器不够13如何??)
??? ??? ??? 根据参数hbase.cluster.distributed分local和distribute模式,这里主要考虑distribute模式下:
??? ??? ??? ??? (1)设置并检查文件系统路径。(checkRootDir方法)
??? ??? ??? ??? ??? a.如果文件系统处于安全模型,则一直等待直到退出安全模式
??? ??? ??? ??? ??? b.若root路径不存在则会创建该目录,并将当前hbase的文件格式版本号写入hbase.version中,并再下一次启动是会检查
??? ??? ??? ??? 是否与当前hbase版本支持的文件格式版本一致。
??? ??? ??? ??? ??? c.检查root Region是否存在,即-ROOT-目录是否存在(root region也是当做一个table来统一处理的)。
??? ??? ??? ??? 不存在,则创建root region和第1个meta region。??? ???
??? ??? ??? ??? ??? root region:regionId=0,tableName=-ROOT-,仅有一个info的Column Family
??? ??? ??? ??? ??? meta region:regionId=1,tableName=.META.,有一个info和historian两个Column Family
??? ??? ??? ??? ??? d.将meta做为root region的user region加入其中(有点拗口)。
??? ??? ??? ??? ???
??? ??? ??? ??? (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管理region servers的信息
??? ??? ??? ???
??? ??? ??? ??? (7)启动RegionManager分配region到region servers,并管理root,meta等状态
??? ??? ??? ???
??? ??? ??? 2.2 master执行过程,启动线程,执行Thread.run()??? ???
??? ??? ??? ??? (1)将master加入集群:
??? ??? ??? ??? ??? 从zookeeper的hbase/root-region-server读取root region所在的regionserver;
??? ??? ??? ??? ??? 读取所有regionserver地址,若没有regionserver则可能是一个新启动的集群,调用HLog.splitLog(this.rootdir, logDir, oldLogDir, this.fs, getConfiguration())(还没看明白???);
??? ??? ??? ??? ???
??? ??? ??? ??? (2)启动服务线程:
??? ??? ??? ??? ??? 启动RegionManager的root和meta region的扫描线程
??? ??? ??? ??? ??? ??? 初始扫描后,应知道所有region的分配信息;而region每次分裂后也应通知master,并分配region给新的regionserver;
??? ??? ??? ??? ??? ??? 但master可能丢失该split信息,因此周期性的扫描root和meta region以检测丢失的split信息及regionserver的死亡信息
??? ??? ??? ??? ??? 启动一个Jetty Server,处理http请求
??? ??? ??? ??? ??? 启动RPC服务

读书人网 >互联网

热点推荐