Storm【技术文档】-Worker Executor Task的关系
2019獨角獸企業重金招聘Python工程師標準>>>
1 ? simple introduction
Storm 在集群上運行一個 Topology的時刻,主要通過以下3個實體來完成Topology的執行工作
1 ?Worker
2 Executor
3 Task
一個Worker 進程執行的是一個topology的子集,這里我們必須強調:不會存在一個worker 為多個topology服務,
一個worker進程會啟動一個或則多個executor 線程來執行一個topology的compotent-》也就是Spout或者bolt,
一個topology就是由于集群中間的多臺物理機上的Worker構成的
一個executor是一個被Worker進程啟動的單獨線程,每一個Executor都只會運行一個topology的一個component,
在默認的情況之下,一個spout,或則一個bolt都只會生成一個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
更加細化的來說:
一個storm topology運行起來之后, 會在supervisor 機器上啟動一些進程來運行spout和bolt實例.?
如果一個topology里面一共有一個spout, 一個bolt。 其中spout的parallelism是2, bolt的parallelism是4, 那么我們可以把這個topology的總工作量看成是6, 那么一共有6個task,那么/tasks/{topology-id}下面一共會有6個以task-id命名的文件,其中兩個文件的內容是spout的id, 其它四個文件的內容是bolt的id。?
task->node+port, 它其實就是從task-id到supervisor-id+port的映射, 也就是把這個task分配給某臺機器的某個端口來做。?
topology里面的組件(spout/bolt)都根據parallelism被分成多個task, 而這些task被分配給supervisor的多個worker來執行。?
task都會跟一個componment-id關聯, componment是spout和bolt的一個統稱.?
對于每一個component在部署的時候都會指定使用的數量, 在storm-user中有一個討論說明了這個問題:?
里面的大意是說, 通過設置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的功能來減小重新部署的時間).?
對于worker和task之間的比例, nathan也給出了參考, 即1個worker包含10~15個左右, 當然這個參考, 實際情況還是要根據配置和測試情況?
3: work 進程內部消息傳遞處理和數據結構分析
本文從外部消息在worker進程內部的轉化,傳遞及處理過程入手,一步步分析在worker-data中的數據項存在的原因和意義。試圖從代碼實現的角度來回答,如果是從頭開始實現worker的話,該如何來定義消息接口,如何實現各自接口上的消息處理。
3.1 Topology 到worker的映射關系
Topology 由Spout,Bolt組成,其中的邏輯關系大體如下
請注意 Acker的行為,是在tuple,以及tuple所產生的其他tuple被確認消費掉以后,才會
有你的ACK行為
無論是Spout或Bolt的處理邏輯都需要在進程或線程內執行,那么它們與進程及線程間的映射關系又是如何呢。有關這個問題,Understanding the Parallelism of a Storm Topology?一文作了很好的總結,現重復一下其要點。
1 ?worker是進程,executor對應于線程,spout或bolt是一個個的task
2 同一個worker只會執行同一個topology相關的task
3 在同一個executor中可以執行多個同類型的task, 即在同一個executor中,要么全部是bolt類的task,要么全部是 spout類的task
4 運行的時候,spout和bolt需要被包裝成一個又一個task
期間的三個組件的關系為:
小結一下,Worker=Process, Executor=Thread, Task=Spout or Bolt.
每一個executor使用的是actor pattern,high level的處理邏輯如下圖所示
轉載于:https://my.oschina.net/infiniteSpace/blog/282652
總結
以上是生活随笔為你收集整理的Storm【技术文档】-Worker Executor Task的关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 音乐(一)
- 下一篇: LINUN 网络连接小记