hbase 源码解析之master篇2
HMaster的RPC接口,分两类:
HMaster与RegionServer通讯接口,总共只有两个
-->regionServerStartup: 当regionserver启动时会调用该接口
-->将发请起求的RS的信息写入serverInfo,注意这里的hostname为master所识别的hostname,而非RS告诉master的
-->调用serverManager的regionServerStartup方法处理该请求
-->check该RS是否deadServer,如果是,拒绝start请求,抛出YouAreDeadException异常
-->check该RS在同样的端口上是否己经启动,如果己经启动,通过serverInfo中的startcode来检查原来的RS是否可以注销,如果不能注销,拒绝请求,抛出PleaseHoldException异常
-->check该RS与master的时钟是否同步,如果相差太多(默认30s),拒绝请求并抛出ClockOutOfSyncException异常
-->注册该RS,具体要做的事有:
-->添加onlineServers
-->清除原有的serverConnections信息
-->将回应写入MapWritable结构,传回给RS
-->regionServerReport: regionserver心跳时调用该接口
-->调用ServerManager的regionServerReport方法,处理report并返回HMsg信息
-->check该RS是否deadServer,如果是,拒绝report请求,抛出YouAreDeadException异常
-->在onlineServers中查找该RS
-->如果找不到
-->check该RS在同样的端口上是否己经启动,如果己经启动,通过serverInfo中的startcode来检查原来的RS是否可以注销,如果不能注销,拒绝请求,抛出PleaseHoldException异常
-->注册一个新的RS
-->如果RS传过来的msg不会空,则抛出PleaseHoldException异常,推迟到下次report时再处理信息
-->如果找到的serverInfo和传过来的serverInfo的startCode不相同(不太可能发生)
-->删除serverInfo中的该server信息
-->向RS发送STOP_REGIONSERVER_ARRAY信号
-->检查传过来的msg,如果是REGION_SPLIT信号,调用getAssignmentManager的handleSplitReport方法,处理split事件
-->下线parent region
-->先把parent region从regionsInTransition状态中删除
-->清除与该parent region有关的regionPlan
-->下线该regions
-->从regions列表中删除它
-->从它所属的serverInfo中删除它对应的regionInfo
-->从己经zk上获得(parent所在的node)数据
-->如果它处于closing状态,删除它
-->从zk上得到它的数据
-->从hmaster的unassignedNodes中删除它
-->向zookeeper发请求删除该node
-->assign两个新的region
-->先清除regionsInTransition队列中的该子region
-->向regions中添加该region的regionInfo
-->向该serverInfo中添加该regionInfo
-->如果正好有跟该region相关的region plan,删除之
-->更新所有region plan中目的地是该RS且在regionsInTransition队列中的元素的state信息,这一步的目的是恢复region plan的有效性
-->如果此时正好用户在disable该region对应的表,需要把它unassign掉
-->更新该region在regionsInTransition中的状态为PENDING_CLOSE
-->调用serverManager的sendRegionClose方法,向RS发送colse region信号
-->如果cluster处理shutdown过程中,且剩余的RS小于等于2了,则发出STOP_REGIONSERVER_ARRAY信号,这是为了保证root和meta所在的RS最后关闭
HMaster的其它RPC接口:
-->isMasterRunning:检查master是否己stop
-->enableTable:
-->启动EnableTableHandler线程,执行handleEnableTable操作
-->调用setTableState,将table状态置为ENABLING
-->在zk上创建一个该table的znode
-->向zk通知该znode状态为ENABLING
-->更新cache中的该znode状态
-->读取.META.表,获取该table的所有region
-->跳过所有己经online的regions
-->创建一个BulkEnabler对象,用它分配所有regions
-->创建一个ExecutorService线程池完成这个工作
-->跳过所有处于transition状态的region
-->调用AssignmentManager的assign方法,注意这里会尽量延用原来在.META.表中的分配方案
-->等待分配的线程结束
-->调用setTableState,将table状态置为ENABLE
-->disableTable:
-->逻辑基本同enableTable,只是调用调用AssignmentManager的unassign方法
-->createTable:
-->强制不等待assign分配完成
-->如果没有指定splitKeys,那么只创建一个region,否则以splitKeys决定startKeys和endKeys,创建多个region
-->通知zk设置table状态为enabled
-->创建region,并在hdfs上创建它的目录
-->向meta所在的RS发送put,以注册.META.信息
-->close这个region,清空其对应的hlog
-->调用userregionassgin来分配它(robbin-round方式)
-->modifyTable:
-->启动modifyHandler线程修改table
-->通过CatalogTracker找到table对应的所有regionInfo
-->调用ModifyTableHandler,创建一个Put,把要修改的info放进去,然后调用connection去put
-->deleteTable:
-->逻辑基本同modifyTable,另外还增加fs上删除目录的操作
-->addColumn:
-->逻辑基本同modifyTable,另外还增加fs上创建目录的操作
-->modifyColumn:
-->逻辑基本同modifyTable,另外还增加fs上修改目录的操作
-->deleteColumn:
-->逻辑基本同modifyTable,另外还增加fs上删除目录的操作
-->shutdown:
-->调用serverManager的shutdownCluster方法关闭cluster
-->置clusterShutdown标志
-->调用master的stop方法
-->通知zookeeper关闭事件
-->stopMaster:置stop标志,并唤醒其它等待的backup master
-->getClusterStatus:返回cluster的信息,包括:版本号、live和dead的servers、transition的regions
-->move:将一个region移到一个确定的RS上
-->assign:分配一个region
-->unassign:卸载一个region
-->balance:直接执行一次balance
-->balanceSwitch:是否关闭balance功能(代码写死打开)