jstorm源碼閱讀(2) —— supervisor簡介 原

jstorm源碼閱讀(2)—— supervisor簡介


模塊功能

  • Heartbeat 模塊用於彙報supervisor心跳信息,包括hostname,workerports,current time和during time等信息,被AsyncLoopThread封裝後默認每隔60s一次。

  • SyncContainerHb 向類似Apsara或Yarn的資源調度框架彙報容器心跳

  • SyncProcessEvent 由SyncSupervisorEvent調用,在run方法中根據傳遞進來的分配信息和Topology id來kill or start workers。

  • EventManagerImp 從隊列中取出事件並執行,that's all。

  • SyncSupervisorEvent 內部組件包括SyncProcessEvent,EventManager,StormClusterState,LocalState,Heartbeat。 run方法是其唯一執行入口,執行過程如下:

  1. 實例化EventManagerZkPusher
RunnableCallback syncCallback = new EventManagerZkPusher(this, syncSupEventManager);
  1. 分別以lcoal-zk-assignment-version和lcoal-zk-assignment爲key從LocalState中獲取task分配信息的快照。
Map<String, Integer> assignmentVersion = (Map<String, Integer>) localState.get(Common.LS_LOCAL_ZK_ASSIGNMENT_VERSION);
if (assignmentVersion == null) {
    assignmentVersion = new HashMap<String, Integer>();
}
Map<String, Assignment> assignments = (Map<String, Assignment>) localState.get(Common.LS_LOCAl_ZK_ASSIGNMENTS);
if (assignments == null) {
    assignments = new HashMap<String, Assignment>();
}
  1. 將zk中的任務分配信息同步到內存。
  2. 獲取本地已經下載了的jar包的topology id.
  3. 過濾出需要本supervisor節點執行的task,並保證每個端口唯一分配給一個task。
  4. 把過濾出的本節點任務信息以local-assignments爲key寫入到LocalState中。
  5. 從zk中獲取所有topology id和其對應的代碼存放路徑,並下載。
  6. 刪除掉本地無用的topology代碼。
  7. 以需要本節點運行的任務信息爲參數調用SyncProcessEvent的run方法來啓動topology。
  8. 設置心跳開關爲true。 但是有個疑問是這個run方法是誰觸發的呢?我們注意到有這樣一行代碼:
RunnableCallback syncCallback = new EventManagerZkPusher(this, syncSupEventManager);
...
getAllAssignments(assignmentVersion, assignments, syncCallback);

代碼中的syncSupEventManager就是EventManagerImp,而EventManagerZkPusher的回調方法就是把this加入到EventManagerImp的隊列中然後在另一個線程中由EventManagerImp完成this.run方法的調用。那麼EventManagerZkPusher的回調方法是在哪裏觸發的呢,我們注意到在獲取task的發佈信息的時候有把syncCallback作爲參數傳遞進去,註冊到StormClusterState中,查看StormZkClusterState的構造函數會發現他向zk中註冊了一個全局的回調函數,在觸發該回調函數時根據參數的不同來選擇具體應該回調哪一個RunnableCallback。

  • EventManagerPusher 構造函數以SyncSupervisorEvent和EventManagerImpl爲參數,用來把SyncSupervisorEvent時間放入EventManagerImpl的隊列中,使用AsyncLoopThread循環執行。
  • HttpServer 主要提供日誌查看功能

OK,以上就是supervisor內部一些模塊的簡單介紹,總體來說就是以EventManagerPusher和zk事件來驅動一個多線程事件驅動模型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章