Storm有關worker、task、spout/bolt、executor、component之間的關係

轉載:http://blog.csdn.net/fzhmoive/article/details/38753135

謝謝分享。

storm學習網站:http://chenlx.blog.51cto.com/4096635/d-1/p-1

整理一下網上有關worker、task、spout/bolt、executor、component之間的關係。

Storm在集羣上運行一個Topology時,主要通過以下3個實體來完成Topology的執行工作:
1. Worker進程
2. Executor線程
3. Task

下圖簡要描述了這3者之間的關係:


1worker進程執行的是1topology的子集(注:不會出現1個worker爲多個topology服務)。1個worker進程會啓動1個或多個executor線程來執行1個topology的component(spout或bolt)。因此,1個運行中的topology就是由集羣中多臺物理機上的多個worker進程組成的。

executor1個被worker進程啓動的單獨線程。每個executor只會運行1topology1component(spoutbolt)task注:task可以是1個或多個,storm默認是1component只生成1taskexecutor線程裏會在每次循環裏順序調用所有task實例)。

task是最終運行spoutbolt中代碼的單元(注:1task即爲spoutbolt1個實例,executor線程在執行期間會調用該tasknextTupleexecute方法)。topology啓動後,1個component(spout或bolt)的task數目是固定不變的,但該component使用的executor線程數可以動態調整(例如:1executor線程可以執行該component1個或多個task實例,當執行多個task實例時executor的數量就減少了)。這意味着,對於1component存在這樣的條件:#threads<=#tasks(即:線程數小於等於task數目)。默認情況下task的數目等於executor線程數目,即1executor線程只運行1task

 

如果一個topology裏面一共有一個spout, 一個bolt。 其中spout的parallelism是2, bolt的parallelism是4, 那麼我們可以把這個topology的總工作量(即task的數量)看成是6, 那麼一共有6個task,那麼/tasks/{topology-id}下面一共會有6個以task-id命名的文件,其中兩個文件的內容是spout的id, 其它四個文件的內容是bolt的id。 

topology裏面的組件(spout/bolt)都根據parallelism被分成多個task, 而這些task被分配給supervisor的多個worker來執行。

task都會跟一個componment-id關聯, componment是spout和bolt的一個統稱。

對於每一個component在部署的時候都會指定使用的數量,通過設置parallelism來指定執行spout/bolt的線程數量. 而在配置中還有另外一個地方(backtype.storm.Config.setNumWorkers(int))來指定一個storm集羣中執行topolgy的進程數量, 所有的線程將在這些指定的worker進程中運行. 比如說一個topology中要啓動300個線程來運行spout/bolt, 而指定的worker進程數量是60個, 那麼storm將會給每個worker分配5個線程來跑spout/bolt, 如果要對一個topology進行調優, 可以調整worker數量和spout/bolt的parallelism數量(調整參數之後要記得重新部署topology. 後續會爲該操作提供一個swapping的功能來減小重新部署的時間). 

 

/**************************************************示例***************************************************************/

圖形理解:

 


Spout或者Bolt的Task個數一旦指定之後就不能改變了,而Executor的數量可以根據情況來進行動態的調整。默認情況下# executor = #tasks即一個Executor中運行着一個Task。

動態調整:



總結:一個topology可以通過setNumWorkers來設置worker的數量,通過設置parallelism來規定executor的數量(一個component(spout/bolt)可以由多個executor來執行),通過setNumTasks來設置每個executor跑多少個task(默認爲一對一)。

task是spout和bolt執行的最小單元。

發佈了26 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章