Storm在集群上運行一個Topology時,主要通過以下3個實體來完成Topology的執行工作:
1. Worker(進程)
2. Executor(線程)
3. Task
下圖簡要描述了這3者之間的關系:
1個worker進程執行的是1個topology的子集(注:不會出現1個worker為多個topology服務)。1個worker進程會啟動1個或多個executor線程來執行1個topology的component(spout或bolt)。因此,1個運行中的topology就是由集群中多台物理機上的多個worker進程組成的。
executor是1個被worker進程啟動的單獨線程。每個executor只會運行1個topology的1個component(spout或bolt)的task(注:task可以是1個或多個,storm默認是1個component只生成1個task,executor線程里會在每次循環里順序調用所有task實例)。
task是最終運行spout或bolt中代碼的單元(注:1個task即為spout或bolt的1個實例,executor線程在執行期間會調用該task的nextTuple或execute方法)。topology啟動后,1個component(spout或bolt)的task數目是固定不變的,但該component使用的executor線程數可以動態調整(例如:1個executor線程可以執行該component的1個或多個task實例)。這意味着,對於1個component存在這樣的條件:#threads<=#tasks(即:線程數小於等於task數目)。默認情況下task的數目等於executor線程數目,即1個executor線程只運行1個task。
參考:https://github.com/nathanmarz/storm/wiki/Understanding-the-parallelism-of-a-Storm-topology