天天看點

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功能(代碼寫死打開)

更多精彩内容請關注:http://bbs.superwu.cn 

關注超人學院微信二維碼:

hbase 源碼解析之master篇2

關注超人學院java免費學習交流群:

hbase 源碼解析之master篇2

轉載于:https://blog.51cto.com/crxy2013/1656462