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功能(代码写死打开)

相关推荐