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方法是其唯一執行入口,執行過程如下:
- 實例化EventManagerZkPusher
RunnableCallback syncCallback = new EventManagerZkPusher(this, syncSupEventManager);
- 分別以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>();
}
- 將zk中的任務分配信息同步到內存。
- 獲取本地已經下載了的jar包的topology id.
- 過濾出需要本supervisor節點執行的task,並保證每個端口唯一分配給一個task。
- 把過濾出的本節點任務信息以local-assignments爲key寫入到LocalState中。
- 從zk中獲取所有topology id和其對應的代碼存放路徑,並下載。
- 刪除掉本地無用的topology代碼。
- 以需要本節點運行的任務信息爲參數調用SyncProcessEvent的run方法來啓動topology。
- 設置心跳開關爲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事件來驅動一個多線程事件驅動模型。