JStorm 原始碼分析 - Nimbus
拓撲會通過 Nimbus 分發給 supervisor, 那麼 Nimbus 內部是怎麼操作的? 這裡以本地模式為例, 對拓撲的提交過程做一個分析.
參考資料: ofollow,noindex" target="_blank">理解storm拓撲並行度
疑問:
- 在zk上建立task資訊,這些資訊是用來做什麼的?
- notifyTopologyActionListener 做了什麼?
啟動
TODO …
命令的入口
所有命令的入口, 都是由 ServiceHandler 實現的, com.alibaba.jstorm.daemon.nimbus.ServiceHandler#submitTopologyWithOpts.
- 配置校驗
- 判斷拓撲是否已存在/重名/重複提交
- 標準化conifg
- 標準化topology (finalize component’s task parallism)
- 校驗topology結構
- 校驗 bolt/spout 的id 和 name
- 校驗 bolt 的輸入是否為空
- 拷貝程式碼二進位制檔案到叢集
- 在zk上建立task資訊 (supervisor會持續監控儲存在zk的任務)
- 為bolt/spout等建立對應的 TaskInfo (多並行度的bolt/spout會創建出多個TaskInfo) com.alibaba.jstorm.cluster.Common#mkTaskMaker
- 注意, jstorm 的 setNumTasks 其實是無效的, 只有 paralleism 並行度會起作用.(見 jstorm作者之一cody的回答: https://stackoverflow.com/a/34316700/6275014 )
- StartTopologyEvent.pushEvent,
- 然後會非同步地去執行 com.alibaba.jstorm.daemon.nimbus.TopologyAssign#mkAssignment
- com.alibaba.jstorm.schedule.default_assign.TaskScheduler#assign: 將task分配給worker, 在這裡做了一些定製化, 如有的task要求分配在不同的worker上等.
- 建立好 Assign 後, 會發布到 zk 上.
- 然後會非同步地去執行 com.alibaba.jstorm.daemon.nimbus.TopologyAssign#mkAssignment
- notifyTopologyActionListener