您好,登錄后才能下訂單哦!
這篇文章主要講解了“Worker、Executor、Task的關(guān)系是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Worker、Executor、Task的關(guān)系是什么”吧!
1 simple introduction
Storm 在集群上運(yùn)行一個(gè) Topology的時(shí)刻,主要通過以下3個(gè)實(shí)體來完成Topology的執(zhí)行工作
1 Worker
2 Executor
3 Task
一個(gè)Worker 進(jìn)程執(zhí)行的是一個(gè)topology的子集,這里我們必須強(qiáng)調(diào):不會(huì)存在一個(gè)worker 為多個(gè)topology服務(wù),
一個(gè)worker進(jìn)程會(huì)啟動(dòng)一個(gè)或則多個(gè)executor 線程來執(zhí)行一個(gè)topology的compotent-》也就是Spout或者bolt,
一個(gè)topology就是由于集群中間的多臺(tái)物理機(jī)上的Worker構(gòu)成的
一個(gè)executor是一個(gè)被Worker進(jìn)程啟動(dòng)的單獨(dú)線程,每一個(gè)Executor都只會(huì)運(yùn)行一個(gè)topology的一個(gè)component,
在默認(rèn)的情況之下,一個(gè)spout,或則一個(gè)bolt都只會(huì)生成一個(gè)task,Executor線程里會(huì)在每次循環(huán)的時(shí)候順序的去調(diào)用所有的task的實(shí)例子
task是最終運(yùn)行spout或bolt中代碼的單元(注:1個(gè)task即為spout或bolt的1個(gè)實(shí)例,executor線程在執(zhí)行期間會(huì)調(diào)用該task的nextTuple或execute方法)。topology啟動(dòng)后,1個(gè)component(spout或bolt)的task數(shù)目是固定不變的,但該component使用的executor線程數(shù)可以動(dòng)態(tài)調(diào)整(例如:1個(gè)executor線程可以執(zhí)行該component的1個(gè)或多個(gè)task實(shí)例)。這意味著,對(duì)于1個(gè)component存在這樣的條件:#threads<=#tasks(即:線程數(shù)小于等于task數(shù)目)。默認(rèn)情況下task的數(shù)目等于executor線程數(shù)目,即1個(gè)executor線程只運(yùn)行1個(gè)task
更加細(xì)化的來說:
一個(gè)storm topology運(yùn)行起來之后, 會(huì)在supervisor 機(jī)器上啟動(dòng)一些進(jìn)程來運(yùn)行spout和bolt實(shí)例.
如果一個(gè)topology里面一共有一個(gè)spout, 一個(gè)bolt。 其中spout的parallelism是2, bolt的parallelism是4, 那么我們可以把這個(gè)topology的總工作量看成是6, 那么一共有6個(gè)task,那么/tasks/{topology-id}下面一共會(huì)有6個(gè)以task-id命名的文件,其中兩個(gè)文件的內(nèi)容是spout的id, 其它四個(gè)文件的內(nèi)容是bolt的id。
task->node+port, 它其實(shí)就是從task-id到supervisor-id+port的映射, 也就是把這個(gè)task分配給某臺(tái)機(jī)器的某個(gè)端口來做。
topology里面的組件(spout/bolt)都根據(jù)parallelism被分成多個(gè)task, 而這些task被分配給supervisor的多個(gè)worker來執(zhí)行。
task都會(huì)跟一個(gè)componment-id關(guān)聯(lián), componment是spout和bolt的一個(gè)統(tǒng)稱.
對(duì)于每一個(gè)component在部署的時(shí)候都會(huì)指定使用的數(shù)量, 在storm-user中有一個(gè)討論說明了這個(gè)問題:
里面的大意是說, 通過設(shè)置parallelism來指定執(zhí)行spout/bolt的線程數(shù)量. 而在配置中還有另外一個(gè)地方(backtype.storm.Config.setNumWorkers(int))來指定一個(gè)storm集群中執(zhí)行topolgy的進(jìn)程數(shù)量, 所有的線程將在這些指定的worker進(jìn)程中運(yùn)行. 比如說一個(gè)topology中要啟動(dòng)300個(gè)線程來運(yùn)行spout/bolt, 而指定的worker進(jìn)程數(shù)量是60個(gè), 那么storm將會(huì)給每個(gè)worker分配5個(gè)線程來跑spout/bolt, 如果要對(duì)一個(gè)topology進(jìn)行調(diào)優(yōu), 可以調(diào)整worker數(shù)量和spout/bolt的parallelism數(shù)量(調(diào)整參數(shù)之后要記得重新部署topology. 后續(xù)會(huì)為該操作提供一個(gè)swapping的功能來減小重新部署的時(shí)間).
對(duì)于worker和task之間的比例, nathan也給出了參考, 即1個(gè)worker包含10~15個(gè)左右, 當(dāng)然這個(gè)參考, 實(shí)際情況還是要根據(jù)配置和測(cè)試情況
3: work 進(jìn)程內(nèi)部消息傳遞處理和數(shù)據(jù)結(jié)構(gòu)分析
本文從外部消息在worker進(jìn)程內(nèi)部的轉(zhuǎn)化,傳遞及處理過程入手,一步步分析在worker-data中的數(shù)據(jù)項(xiàng)存在的原因和意義。試圖從代碼實(shí)現(xiàn)的角度來回答,如果是從頭開始實(shí)現(xiàn)worker的話,該如何來定義消息接口,如何實(shí)現(xiàn)各自接口上的消息處理。
3.1 Topology 到worker的映射關(guān)系
Topology 由Spout,Bolt組成,其中的邏輯關(guān)系大體如下
請(qǐng)注意 Acker的行為,是在tuple,以及tuple所產(chǎn)生的其他tuple被確認(rèn)消費(fèi)掉以后,才會(huì)
有你的ACK行為
無論是Spout或Bolt的處理邏輯都需要在進(jìn)程或線程內(nèi)執(zhí)行,那么它們與進(jìn)程及線程間的映射關(guān)系又是如何呢。有關(guān)這個(gè)問題,Understanding the Parallelism of a Storm Topology 一文作了很好的總結(jié),現(xiàn)重復(fù)一下其要點(diǎn)。
1 worker是進(jìn)程,executor對(duì)應(yīng)于線程,spout或bolt是一個(gè)個(gè)的task
2 同一個(gè)worker只會(huì)執(zhí)行同一個(gè)topology相關(guān)的task
3 在同一個(gè)executor中可以執(zhí)行多個(gè)同類型的task, 即在同一個(gè)executor中,要么全部是bolt類的task,要么全部是 spout類的task
4 運(yùn)行的時(shí)候,spout和bolt需要被包裝成一個(gè)又一個(gè)task
期間的三個(gè)組件的關(guān)系為:
小結(jié)一下,Worker=Process, Executor=Thread, Task=Spout or Bolt.
每一個(gè)executor使用的是actor pattern,high level的處理邏輯如下圖所示
感謝各位的閱讀,以上就是“Worker、Executor、Task的關(guān)系是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Worker、Executor、Task的關(guān)系是什么這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。