storm(06)——storm原理(任務提交流程)
Storm 任務提交的過程
client: 1.client提交topology 到Nimbus; Nimbus: 2.提交的jar包會被上傳到nimbus伺服器的nimbus/inbox目錄下; 3.submitTopology方法對這個topology進行處理,一般包括對storm本身以及topology的校驗,檢查storm的狀態是否為active,檢查是否已經有同名的topology已經在執行等。 4.簡歷topology的本地目錄; 5.nimbus分配任務,根據topology定義中給定的引數,給spout/bolt設定task資料,分配對應的task-id,最後把分配好task的資訊寫入到zookeeper的/task目錄; 6.nimbus在zookeeper上建立taskbeats目錄,要求每個task定時傳送心跳資訊; 7.將分配好的任務,寫入zookeeper,任務提交完畢; 8.將topology的資訊寫入到zookeeper/storms目錄; Supervisor: 1、定期掃描zookeeper上的storms目錄,檢視是否有新的任務; 2、刪除本地不再執行的topology的程式碼; 3、根據nimbus指定的任務資訊啟動worker進行工作; Worker: 1.檢視乣執行哪些任務; 2.根據taskid分辨出spout、bolt; 3.計算出所代表的的spout/bolt會給哪些task傳送訊息; 4.根據ip和埠號建立響應的網路連線用來發送訊息。
Storm啟動流程分析
client
1、客戶端執行storm nimbus時,會呼叫storm的python指令碼,該指令碼中為每個命令編寫一個方法,每個方法都可以生成一條相應的java命令。 命令格式如下:
java -server xxxx.ClassName -args nimbus---> Running: /export/servers/jdk/bin/java -server backtype.storm.daemon.nimbus supervisor---> Running: /export/servers/jdk/bin/java -server backtype.storm.daemon.supervisor
nimbus
2、nibums啟動之後,接受客戶端提交任務 命令格式:storm jar xxx.jar xxx驅動類 引數
Running: /export/servers/jdk/bin/java -client -Dstorm.jar=/export/servers/storm/examples/storm-starter/storm-starter-topologies-0.9.6.jar storm.starter.WordCountTopology wordcount-28
該命令會執行 storm-starter-topologies-0.9.6.jar 中的storm-starter-topologies-0.9.6.jar的main方法,main方法中會執行以下程式碼:
StormSubmitter.submitTopology("mywordcount",config,topologyBuilder.createTopology());
topologyBuilder.createTopology(),會將client編寫的spout物件和bolt物件進行序列化。
將使用者的jar上傳到 nimbus物理節點的 /export/data/storm/workdir/nimbus/inbox目錄下。並且改名,改名的規則是添加了一個UUID字串。
在nimbus物理節點的 /export/data/storm/workdir/nimbus/stormdist目錄下。有當前正在執行的topology的jar包和配置檔案,序列化物件檔案。
3、nimbus接受到任務之後,會將任務進行分配,分配會產生一個assignment物件,該物件會儲存到zk中,目錄是/storm/assignments ,該目錄只儲存正在執行的topology任務。
supervisor
4、supervisor通過watch機制,感知到nimbus在zk上的任務分配資訊,從zk上拉取任務資訊,分辨出屬於自己任務。 5、supervisor 根據自己的任務資訊,啟動自己的worker,並分配一個埠。
worker
6、worker啟動之後,連線zk,拉取任務. worker通過反序列化,得到程式設計師自己定義的spout和bolt物件。
7、worker根據任務型別,分別執行spout任務或者bolt任務。 spout的生命週期是:open、nextTuple、outPutFiled bolt的生命週期是:prepare、execute(tuple)、outPutFiled