email:chenguibin2004@126.com
storm: 是一個分布式的實時流式計算框架,具有低延遲、高可用、分布式、可擴展、數據不丟失的特點,
storm包含四個核心組件:
Nimbus:負責資源分配和任務調度。
Supervisor:負責接受nimbus分配的任務,啟動和停止屬於自己管理的worker進程。---通過配置文件設置當前supervisor上啟 動多少個worker。
Worker:運行具體處理組件邏輯的進程。Worker運行的任務類型只有兩種,一種是Spout任務,一種是Bolt任務。
Task:worker中每一個spout/bolt的線程稱為一個task. 在storm
0.8之后,task不再與物理線程對應,不同spout/bolt的task可能會共享一個物理線程,該線程稱為executor。
storm的編程模型包含以下一個方面:
Topology:Storm中運行的一個實時應用程序的名稱。(拓撲)
Spout:在一個topology中獲取源數據流的組件,通常情況下spout會從外部數據源中讀取數據,然后轉換為topology內部的源數據。
Bolt:接受數據然后執行處理的組件,用戶可以在其中執行自己想要的操作。
Tuple:一次消息傳遞的基本單元,理解為一組消息就是一個Tuple,內部是一個list。
Stream:表示數據的流向。
Storm啟動流程分析
------------程序員client------------------
1、客戶端運行storm nimbus時,會調用storm的python腳本,該腳本中為每個命令編寫一個方法,每個方法都可以生成一條相應的java命令。
命令格式如下:java -server xxxx.ClassName -args
nimbus---> Running:/jdk/bin/java -server backtype.storm.daemon.nimbus
supervisor---> Running: /jdk/bin/java -server backtype.storm.daemon.supervisor
--------------nimbus---------------------
2
命令格式:storm jar xxx.jar xxx驅動類 參數
Running: /jdk/bin/java -client -Dstorm.jar=/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(),會將程序猿編寫的spout對象和bolt對象進行序列化。
會將用戶的jar上傳到 nimbus物理節點的/storm/workdir/nimbus/inbox目錄下。並且改名,改名的規則是添加了一個UUID字符串。
在nimbus物理節點的/storm/workdir/nimbus/stormdist目錄下。有當前正在運行的topology的jar包和配置文件,序列化對象文件。
3、nimbus接受到任務之后,會將任務進行分配,分配會產生一個assignment對象,該對象會保存到zk中,目錄是/storm/assignments ,該目錄只保存正在運行的topology任務。
--------supervisor------------------
4、supervisor通過watch機制,感知到nimbus在zk上的任務分配信息,從zk上拉取任務信息,分辨出屬於自己任務。
ResourceWorkerSlot[hostname=192.168.1.106,memSize=0,cpu=0,tasks=[1, 2, 3, 4, 5, 6, 7, 8],jvm=<null>,nodeId=61ce10a7-1e78-4c47-9fb3-c21f43a331ba,port=6900]
5、supervisor 根據自己的任務信息,啟動自己的worker,並分配一個端口。
'/export/servers/jdk/bin/java' '-server' '-Xmx768m' export/data/storm/workdir/supervisor/stormdist/wordcount1-3-1461683066/stormjar.jar' 'backtype.storm.daemon.worker' 'wordcount1-3-1461683066' 'a69bb8fc-e08e-4d55-b51f-e539b066f90b' '6701' '9fac2805-7d2b-4e40-aabc-1c85c9856d64'
---------worker----------------------
6、worker啟動之后,連接zk,拉取任務
ResourceWorkerSlot[hostname=192.168.1.106,memSize=0,cpu=0,tasks=[1, 2, 3, 4, 5, 6, 7, 8],jvm=<null>,nodeId=61ce10a7-1e78-4c47-9fb3-c21f43a331ba,port=6900]
