master
初始化HMaster
创建RPC服务
启动一个responder线程
创建nio selector
默认超时时间为15 mins
依次将responseQueue中的内容写回各通道,并关闭连接
如果该请求的返回没有写完,则放回队列头,推迟再发送
对于超时未完成的响应,丢弃并关闭相应连接
启动一个listener线程
创建Reader和readPool
判断Selector中是否有数据
如果有,则把数据读出,然后加入到 callQueue或者priorityCallQueue中
启动n个handers
启动处理线程组(分为一般的和优先的)
每一个线程组从call队列中读取数据,并调用对应的call方法(具体由客户端设定)
把每一个call的处理结果加入到responder会处理的responseQueue队列中
创建ZooKeeperWatcher
创建MasterMetrics对象
启动线程 run()
创建activeMasterManager,加入到listener队列
检查是否backup master
三分钟循环检查一次,直到系统中master挂掉
往zk写master地址并watch
成为active master,然后进入finishInitialization函数
阻塞并反复通过watcher检查在运行的master是否挂掉或stop状态
finishInitialization
创建MasterFileSystem对象
检查hbase版本
检查root region是否存在
创建root region
regionId为0,列只有info
首先判断region对应的. Regioninfo文件是否存在,如果大小非0,那么就认为已经写过regioninfo,否则写regioninfo数据,接着清除临时目录
对每一个ColumnFamily初始化Store
根据初始化Store时读到的maxSeqId,来进行日志回放,每一个RegionServer对应一个日志文件
把上次遗留的split文件清理掉,以及compaction时的merger目录也删除掉
创建meta region
第一个meta region id为1
初始化
把meta信息加入到root表中
关闭root region和meta region
创建HConnectionImplementation对象
创建ServerManager对象
创建并启动CatalogTracker线程
启动rootRegionTracker线程
启动metaNodeTracker线程
向zk注册AssignmentManager,用以管理region的分配
创建并启动RegionServerTracker线程
创建并启动ClusterStatusTracker线程
创建线程池ExecutorService
MASTER_OPEN_REGION
MASTER_CLOSE_REGION
MASTER_SERVER_OPERATIONS
MASTER_META_SERVER_OPERATIONS
MASTER_TABLE_OPERATIONS
以守护方式运行LogCleaner线程
启动一个http server:InfoServer
RPCServer开始处理请求
serverManager.waitForRegionServers
每隔1500ms统计region server的数量
如果数量没变 && 数量>1 && 超过了4500s
统计region servers的region数量并返回
splitLogAfterStartup
对.logs下每个hlog目录,查看它所属的region server是否online
不需要做任何动作(region server自己会恢复数据)
需要将它分配(split log)给其它 的region server
splitLogLock.lock()
创建一个HLogSplitter
先通过lease机制检查文件是否能够append,如果不能则死循环等待
启动3个写线程
从内存中读出每一行数据的key和value,然后查询相应的region路径。如果该region路径不存在,说明该region很可能己经被split了,则不处理这部分数 据,因为此时忽略它们是安全的。
如果上一步能查到相应的路径,则到对应路径下创建"recovered.edits"文件夹(如果该文件夹存在则删除后覆盖之),然后将数据写入该文件夹
把hlog中的内容全部加载到内存中(内存同时被几个写线程消费)
把有损坏并且跳过的文件移到/hbase/.corrupt/目录中
把其余己经处理过的文件移到/hbase/.oldlogs中,然后删除原有的server目录
等待写线程结束,返回新写的所有路径
把被处理的日志分别放到指定的corrupt目录和oldLogDir目录下,然后关闭writerThreads线程组
splitLogLock.unlock()
assignRootAndMeta
ROOT region
processRegionInTransitionAndBlockUntilAssigned
verifyRootRegionLocation
Topic
Topic
assignRoot
waitForRoot
meta region
processRegionInTransitionAndBlockUntilAssigned
verifyMetaRegionLocation
Topic
Topic
assignMeta
waitForMeta
waitForAssignment
regionCount==0 ?
fresh start
cleanoutUnassigned
assignAllUserRegions
扫描meta中的所有表,依次分配
hbase.master.startup.retainassign
按meta表中原有的信息来分配,即原来在哪里就还分到哪里,如果哪个region在原有的 server info中找不到所属的region server则从online region server中随机挑选
随机循环添加region,会保证balance
分配方案设计好后,开始执行分配的线程,默认超时时间10分钟
processFailover
rebuildUserRegions
处理deadServers
遍历所有的region,在zk上创建它们的node,把它们加入transition和unassign列表,并置状态为offline
ServerShutdownHandler -> processDeadRegion
跳过所有disabled的table对应的region
查看该region是否己经split,如果是,需要fix它的子region
查看子region的info是否找不到了,如果是的话修补之(即重新将meta表中的region信息添加进来并assign它)
扫描zk中的transition列表,对不同的事件做不同处理
RS_ZK_REGION_CLOSING
添加到regionsInTransition队列中
RS_ZK_REGION_CLOSED
添加到regionsInTransition队列中并且创建一个ClosedRegionHandler线程去处理它
按root/meta/user region分优先级
如果这个region对应的table己经disabled或disabling,那么下线它并返回
下线这个region,然后再将它分配给一个serve
M_ZK_REGION_OFFLINE
同上
RS_ZK_REGION_OPENING
添加到regionsInTransition队列
RS_ZK_REGION_OPENED
添加到regionsInTransition队列中
对应的原来的RS是否存在
创建一个OpenedRegionHandler线程来处理
按root/meta/user region分优先级
先删除zk中己经打开的对应的node
上线这个region
如果这个region对应的table己经disabled或disabling,那么unassign它
不处理,等待meta扫描时去分配它
getAndStartBalancerChore
balanceSwitch
isRegionsInTransition
areDeadServersInProgress
制定出balance计划
执行balance计划
将执行计划放入assignment的执行计划列表
检查该region是否又进入了transaction状态,如果是则跳过
将该region置为pending_close状态
向region server发送close region的信号
真实执行计划
CatalogJanitor
initialChore() chore()
scan()
fullscan()
isSplitParent()
Map<HRegionInfo, Result> splitParents
遍历splitParents
cleanParent(...)
HConstants.SPLITA_QUALIFIER HConstants.SPLITB_QUALIFIER
checkDaughter()
getAssignmentManager().regionOffline
regionsInTransition.remove
clearRegionPlan
setOffline
HRegion.deleteRegion
MetaEditor.deleteRegion
loop
stop?
stopChores()
balancerChore.interrupt()
catalogJanitorChore.interrupt()
serverManager.letRegionServersShutdown()
stopServiceThreads()
rpcServer.stop()
logCleaner.interrupt()
infoServer.stop()
activeMasterManager.stop()
catalogTracker.stop()
serverManager.stop()
assignmentManager.stop()
HConnectionManager.deleteConnection
zooKeeper.close()
region server
client