流程分析,按先后顺序 1 HMaster构造函数 HRegionServer构造函数, HRegionServer的RPC端口默认是60020,master的RPC端口默认是60000 HRegionServer的Jetty(InfoServer)端口默认是60030,master的Jetty(InfoServer)端口默认是60010 1.1 获取当前运行HMaster的机器的地址 1.2 生成HBaseServer对象用于接收RPC请求,并启动HBaseServer的相关线程 1.3 生成ZooKeeperWatcher对象 在构造函数中生成这些持久结点: /hbase, /hbase/unassigned, /hbase/rs, /hbase/table, /hbase/splitlog ZooKeeperWatcher管理下面10个结点: baseZNode "/hbase" rootServerZNode "/hbase/root-region-server" rsZNode "/hbase/rs" drainingZNode "/hbase/draining" masterAddressZNode "/hbase/master" clusterStateZNode "/hbase/shutdown" assignmentZNode "/hbase/unassigned" tableZNode "/hbase/table" clusterIdZNode "/hbase/hbaseid" splitLogZNode "/hbase/splitlog" schemaZNode "/hbase/schema" 这6个结点在ZooKeeperWatcher构造函数中生成 baseZNode "/hbase" rsZNode "/hbase/rs" drainingZNode "/hbase/draining" assignmentZNode "/hbase/unassigned" tableZNode "/hbase/table" splitLogZNode "/hbase/splitlog" schemaZNode "/hbase/schema" 这4个在不同地方生成 rootServerZNode "/hbase/root-region-server" masterAddressZNode "/hbase/master" //在HMaster中建立,并且是一个短暂结点,结点的值是HMaster的ServerName //见org.apache.hadoop.hbase.master.ActiveMasterManager.blockUntilBecomingActiveMaster clusterStateZNode "/hbase/shutdown" clusterIdZNode "/hbase/hbaseid" //在HMaster.finishInitialization方法中调用ClusterId.setClusterId建立,结点值是UUID 1.4 生成MasterMetrics对象 2 HMaster.run 2.1 生成ActiveMasterManager对象,如果此HMaster作为一个备份(backup), 那么需要等到集群中有Active Master时才往下调用blockUntilBecomingActiveMaster, 并且调用blockUntilBecomingActiveMaster也会阻塞,直到它变成ActiveMaster。 与此同时,在blockUntilBecomingActiveMaster中会创建短暂结点"/hbase/master", 此节点的值是HMaster的版本化ServerName(也就是version+ServerName), 此结点用于协调region server的启动,只有"/hbase/master"创建好后,region server才能往下进行。 2.2 调用HMaster.finishInitialization 2.2.1 生成MasterFileSystem对象 建立由hbase-site.xml的hbase.rootdir属性指定的目录(如:file:/E:/hbase/data) 调用FSUtils.setVersion在hbase.rootdir目录中建立一个hbase.version文件,并写入版本号(HConstants.FILE_SYSTEM_VERSION=7) 判断-ROOT-分区是否存在,不存在则调用MasterFileSystem.bootstrap来创新-ROOT-和.META. 最后创建file:/E:/hbase/data/.oldlogs目录 2.2.2 如果持久结点"/hbase/hbaseid"不存在则创建它,否则不创建,同时每次master启动时都会把此节点的值设为hbase.id文件中的值 2.2.3 生成ExecutorService (TODO) 2.2.4 生成ServerManager (TODO) 2.2.5 initializeZKBasedSystemTrackers 2.2.5.1 生成CatalogTracker, 它包含两个ZooKeeperNodeTracker,分别是RootRegionTracker和MetaNodeTracker, 对应/hbase/root-region-server和/hbase/unassigned/1028785192这两个结点(1028785192是.META.的分区名) 如果之前从未启动过hbase,那么在start CatalogTracker时这两个结点不存在。 /hbase/root-region-server是一个持久结点,在RootLocationEditor中建立 2.2.5.2 生成AssignmentManager 2.2.5.3 生成 LoadBalancer 2.2.5.4 生成 RegionServerTracker: 监控"/hbase/rs"结点 2.2.5.5 生成 DrainingServerTracker: 监控"/hbase/draining"结点 2.2.5.6 生成 ClusterStatusTracker,通过它的setClusterUp方法创建持久结点"/hbase/shutdown",结点值是当前时间, 如果结点已存在(master可能未正常关闭),那么此结点的值不更新。 2.2.6 生成 MasterCoprocessorHost 2.2.7 startServiceThreads() 启动服务线程 (MASTER_OPEN_REGION、MASTER_CLOSE_REGION、MASTER_SERVER_OPERATIONS、MASTER_META_SERVER_OPERATIONS、MASTER_TABLE_OPERATIONS 这几个只是生成Executor,并未正式启动, 正式启动的有LogCleaner,和基于Jetty的InfoServer(端口号默认是60010)) 2.2.8 等待RegionServer注册 2.2.9 splitLogAfterStartup (TODO) 2.2.10 assignRootAndMeta 2.2.10.1 processRegionInTransitionAndBlockUntilAssigned 先看一下分区正在转换状态当中,如果处于转换状态当中则先处理相关的状态,并等待体处理结束后再往下进行。 2.2.10.2 verifyRootRegionLocation 2.2.10.3 getRootLocation 2.2.10.4.A expireIfOnline 2.2.10.4.B assignRoot 先删掉"/hbase/root-region-server",不管它存不存在,KeeperException.NoNodeException被忽略了 写入EventType.M_ZK_REGION_OFFLINE、当前时间戳、跟分区名(-ROOT-,,0)、master的版本化ServerName 到/hbase/unassigned/70236052, payload为null,所以不写入 RegionServer修改/hbase/unassigned/70236052的值, 写入EventType.RS_ZK_REGION_OPENING、当前时间戳、跟分区名(-ROOT-,,0)、RegionServer的版本化ServerName 2.2.11 MetaMigrationRemovingHTD.updateMetaWithNewHRI 2.2.12 assignmentManager.joinCluster() 把meta表中的分区读出来,然后分配到Region Server, meta表只有一个列族:info,存入meta的行有三列: regioninfo、server、serverstartcode, 其中regioninfo对应HRegionInfo, server对应ServerName的host和port serverstartcode对应ServerName的startcode(一般是时间戳)。 2.2.12.1 rebuildUserRegions() 2.2.12.1.1 调用MetaReader.fullScan 从meta表中取出所有的分区,得到一个List<Result>, 调用MetaReader.parseCatalogResult,解析每个result得到Pair<HRegionInfo, ServerName>, 其中HRegionInfo由regioninfo列的值反序列化得来,ServerName由server、serverstartcode两列的值反序列化后组合而成。 2.2.12.2 processDeadServersAndRegionsInTransition