hbase 源码解析之master篇2,hbasemaster


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

更多精彩内容请关注:http://bbs.superwu.cn

关注超人学院微信二维码:

关注超人学院java免费学习交流群:

相关内容