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
關注超人學院微信二維碼:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiN0ITM0ETM2ETOyUDM1EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
關注超人學院java免費學習交流群:
轉載于:https://blog.51cto.com/crxy2013/1656462