1. 程式人生 > >storm(06)——storm原理(任務提交流程)

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