本節書摘來自華章計算機《storm分布式實時計算模式》一書中的第1章,第1.4節,作者:(美)p. taylor goetz brian o’neill 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
在storm的間接中提到過,storm計算支援在多台機器上水準擴容,通過将計算切分為多個獨立的tasks在叢集上并發執行來實作。在storm中,一個task可以簡單地了解為在叢集某節點上運作的一個spout或者bolt執行個體。
為了了解storm的并發機制是如何運作的,我們先來解釋下在叢集中運作的topology的四個主要組成部分:
nodes(伺服器):指配置在一個storm叢集中的伺服器,會執行topology的一部分運算。一個storm叢集可以包括一個或者多個工作node。
workers(jvm虛拟機):指一個node上互相獨立運作的jvm程序。每個node可以配置運作一個或者多個worker。一個topology會配置設定到一個或者多個worker上運作。
executeor(線程):指一個worker的jvm程序中運作的java線程。多個task可以指派給同一個executer來執行。除非是明确指定,storm預設會給每個executor配置設定一個task。
task(bolt/spout執行個體):task是spout和bolt的執行個體,它們的nexttuple()和execute()方法會被executors線程調用執行。
1.4.1 wordcounttopology的并發機制
到目前為止,在單詞計數的示例中沒有明确使用任何storm中并發機制的api,而是讓storm使用預設配置。在大多數情況下,除非明确指定,strom的預設并發設定預設是1。
在我們修改topology的并發度之前,先來看預設配置下topology是如何執行的。假設我們有一台伺服器(node),為topology配置設定了一個worker,并且每個executer執行一個task。我們的topology執行過程如圖1-3所示:

正如在圖中看到的,唯一的并發機制出現線上程級。每個任務在同一個jvm的不同線程中執行。如何增加并發度以充分利用硬體能力?讓我們來增加配置設定給topology的worker和executer的數量。
1.4.2 給topology增加worker
增加額外的worker是增加topology計算能力的簡單方法。為此storm提供了api和修改配置項兩種修改方法。無論采取哪種方法,spout和bolt元件都不需要做變更,可以直接複用。
在單詞計數topology前面的版本中,我們引入了config對象在釋出時傳遞參數給submittopology()方法,但是沒有做更多配置操作。為了增加配置設定給一個topology的worker數量,隻需要簡單的調用一下config對象的setnumworkers()方法:
這樣就給topology配置設定了兩個worker而不是預設的一個。進而增加了topology的計算資源,也更有效的利用了計算資源。我們還可以調整topology中的executor個數以及每個executor配置設定的task數量。
1.4.3 配置executor和task
我們已經知道,storm給topology中定義的每個元件建立一個task,預設的情況下,每個task配置設定一個executor。storm的并發機制api對此提供了控制方法,允許設定每個task對應的executor個數和每個executor可執行的task的個數。
在定義資料流分組時,可以設定給一個元件指派的executor的數量。為了說明這個功能,修改topology的定義代碼,設定sentencespout并發為兩個task,每個task指派各自的executor線程。
如果隻使用一個worker,topology的執行如圖1-4所示。
下一步,我們給語句分割bolt splitsentencebolt設定4個task和2個executor。每個executor線程指派2個task來執行(4/2=2)。還将配置單詞計數bolt運作四個task,每個task由一個executor線程執行:
在2個worker的情況下,topology執行如圖1-5所示。
增加了topology并發後,運作更新過的wordcounttopology類,每個單詞的計數比原topology要多:
https://yqfile.alicdn.com/0e31d5ae76314f1cefdda3cd81516ef173294f39.png
" >
spout在topology關閉之前會一直發射資料,單詞的計數值取決于計算機的速度,是否有其他程式在運作。總量上看發射和處理的單詞增多了。
要重點指出的是,當topology執行在本地模式時,增加worker的數量不會達到提高速度的效果。因為topology在本地模式下是在同一個jvm程序中執行的,是以隻有增加task和executor的并發度配置才會生效。storm的本地模式提供了接近叢集模式的模拟,對開發是否有幫助。但程式在投入生産環境之前,必須在真實的叢集環境下進行測試。