Storm并發(fā)度詳解(轉(zhuǎn)載)

轉(zhuǎn)自:http://blog.csdn.net/lzm1340458776/article/details/45286207

工作進程(Worker Process)

Worker是Spout/Bolt中運行具體處理邏輯的進程。拓撲跨一個或多個Worker進程執(zhí)行。每個Worker進程是一個物理的JVM和拓撲執(zhí)行所有任務(wù)的一個子集。例如,如果合并并行度的拓撲是300,已經(jīng)分配50個Worker,然后每個Worker將執(zhí)行6個任務(wù),Storm會嘗試在所有Worker上均勻的發(fā)布任務(wù)。

執(zhí)行器(Executor)

Executor稱為物理線程,每個Worker可以包含多個Executor。

任務(wù)(Task)

Task是具體的處理邏輯對象,默認情況下,執(zhí)行器和任務(wù)對應(yīng),即一個執(zhí)行器對應(yīng)一個任務(wù)。

工作進程、執(zhí)行器、任務(wù)三者之間的關(guān)系如下圖所示:

Storm集群的一個節(jié)點可能有一個或者多個工作進程運行在運行在一個或者過個拓撲上,一個工作進程執(zhí)行拓撲的一個子集。工作進程屬于一個特定的拓撲,并可能為這個拓撲的一個或多個組件(spout或bolt)運行一個或多個執(zhí)行器。一個運行中的拓撲包括多個運行在Storm集群內(nèi)多個節(jié)點的進程。

一個或者多個執(zhí)行器可能運行在一個工作進程內(nèi),執(zhí)行器是由工作進程產(chǎn)生的一個線程,他可能為相同的組件(Spout或Bolt)運行一個或多個任務(wù)。

任務(wù)執(zhí)行真正的數(shù)據(jù)處理,代碼中實現(xiàn)的每個Spout或Bolt,作為很多任務(wù)跨集群執(zhí)行。一個組件的任務(wù)數(shù)量始終貫穿拓撲的整個生命周期,但一個組件的執(zhí)行器(線程)數(shù)量可以隨時間而該變。默認情況下,一個執(zhí)行器包含一個任務(wù)數(shù),即Storm會使用每個線程執(zhí)行一個任務(wù)。

配置拓撲的并行度

1.工作進程的數(shù)量

工作進程的數(shù)量表示集群中不同節(jié)點的拓撲可以創(chuàng)建愛你多少個工作進程。

配置參數(shù)是:TOPOLOGY_WORKERS

也可以通過JavaAPI進行設(shè)置:


Config#setNumWorkers

2.執(zhí)行器(線程)的數(shù)量

執(zhí)行器的數(shù)量指的是每個組件產(chǎn)生多少個線程。

這個參數(shù)暫時只能通過javaAPI進行配置:


TopologyBuilder#setSpout()

TopologyBuilder#setBolt()

3.任務(wù)的數(shù)量

任務(wù)的數(shù)量表示的是每個組件創(chuàng)建多少個任務(wù)。

配置選項:TOPOLOGY_TASKS

也可以通過JavaAPI進行配置:


ComponentConfigurationDeclarer#setNumTasks()

T?setNumTasks(java.lang.Number?val)

拓撲示例

下面我們定義一個名為mytopology的拓撲,由一個Spout組件(BlueSpout)、兩個Bolt組件(GreenBolt和YellowBolt)共三個組件構(gòu)成,代碼如下:


Configconf=newConfig();

conf.setNumWorkers(2);

topologyBuilder.setSpout("blue-spout",?new?BlueSpout(),?2);

topologyBuilder.setBolt("green-bolt",?new?GreenBolt(),?2)

.setNumTasks(4)

.shuffleGrouping("blue-spout");

topologyBuilder.setBolt("yellow-bolt",?new?YellowBolt(),?6)

.shuffleGrouping("green-bolt");

StormSubmitter.submitTopology(

"mytopology",

conf,

topologyBuilder.createTopology()

);

mytopology拓撲的描述如下:

1.拓撲將使用兩個工作進程(Worker)。

2.Spout是id為“blue-spout”、并行度為2的BlueSpout實例(產(chǎn)生兩個執(zhí)行器和兩個任務(wù))。

3.第一個Bolt的id為"green-bolt"、并行度為2、任務(wù)數(shù)為4、使用隨機分組方式接收"blue-spout"所發(fā)射元組的GreenBolt實例(產(chǎn)生兩個執(zhí)行器和4個任務(wù))。

4.第二個Bolt是id為"yellow-bolt"、并行度為6、使用隨機分組方式接收"green-bolt"所發(fā)射元組的YellowBolt實例(產(chǎn)生6個執(zhí)行器和6個任務(wù))。

綜上所述,該拓撲一共有兩個工作進程(Worker),2+2+6=10個執(zhí)行器(Executor),2+3+6=12個任務(wù)。因此,每個工作進程可以分配到10/2=5個執(zhí)行器,12/2=6個任務(wù)。默認情況下,一個執(zhí)行器執(zhí)行一個任務(wù),但是如果指定了任務(wù)的數(shù)目,則任務(wù)會平均分配到執(zhí)行器中,因此,GreenBolt的實例"green-bolt"的一個執(zhí)行器將會分配到4/2個任務(wù)。

mytopology的拓撲及其對應(yīng)的資源分配如下圖所示:

、

動態(tài)設(shè)置拓撲的并發(fā)度

Storm支持在不重啟Topolog的情況下,動態(tài)的改變(增減)worker process的數(shù)目和Executor的數(shù)目,稱為rebalancing。有兩種方式可以實現(xiàn)拓撲的再平衡:

1.使用Storm Web UI

2.使用Storm rebalance命令(推薦使用)

使用命令行的方式如下:


#?重新配置拓撲

#?"mytopology"?拓撲使用5個Worker進程

#?"blue-spout"?Spout使用3個Executor

#?"blue-spout"?Bolt使用10個Executor

#?storm?rebalance?mytopology?-n?5?-eblue-spout=3-eyellow-bolt=10

注:"mytopology"是拓撲的名稱,"blue-spout"和"yellow-bolt"是組件的名稱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容