1. 程式人生 > >Storm的並行度詳解

Storm的並行度詳解

文章來源:http://www.bubuko.com/infodetail-822074.html

Storm的並行度詳解 Storm的並行度是非常重要的,通過提高並行度可以提高storm程式的計算能力。 strom是如何提高並行度的呢? Strom程式的執行是由多個supervisor共同執行的。supervisor執行的是topology中的spout/bolt task task  storm中進行計算的最小的執行單位,表示是spout或者bolt的執行例項。 程式執行的最大粒度的執行單位是程序,剛才說的task也是需要有程序來執行它的,在supervisor中,執行task的程序稱為
worker Supervisor節點上可以執行非常多的worker程序,一般在一個程序中是可以啟動多個執行緒的,所以我們可以在worker中執行多個執行緒,這些執行緒稱為executor,在executor中執行task 這樣的話就可以提高strom的計算能力。 總結一下:worker>executor>task 要想提高storm的並行度可以從三個方面來改造 worker(程序)>executor(執行緒)>task(例項) 增加work程序,增加executor執行緒,增加task例項 看下面的圖: 這表示是一個work程序,其實就是一個
jvm虛擬機器程序,在這個work程序裡面有多個executor執行緒,每個executor執行緒會執行一個或多個task例項。一個task是最終完成資料處理的實體單元。(預設情況下一個executor執行一個task) 技術分享 worker,executor,task解釋 1worker程序執行的是1topology的子集(注:不會出現1worker為多個topology服務)。1worker程序會啟動1個或多個executor執行緒來執行1topologycomponent(spoutbolt)。因此,1個執行中的topology就是由叢集中多臺物理機上的多個worker程序組成的。
executor1個被worker程序啟動的單獨執行緒。每個executor只會執行1topology1component(spoutbolt)task(注:task可以是1個或多個,storm預設是1component只生成1taskexecutor執行緒裡會在每次迴圈裡順序呼叫所有task例項)。 task是最終執行spoutbolt中程式碼的單元(注:1task即為spoutbolt1個例項,executor執行緒在執行期間會呼叫該tasknextTupleexecute方法)。topology啟動後,1component(spoutbolt)task數目是固定不變的,但該component使用的executor執行緒數可以動態調整(例如:1executor執行緒可以執行該component1個或多個task例項)。這意味著,對於1component存在這樣的條件:#threads<=#tasks(即:執行緒數小於等於task數目)。預設情況下task的數目等於executor執行緒數目,即1executor執行緒只執行1task 剛才從理論說明了如何提高叢集的並行度,在這裡我們就來看一下這些東西worker(程序)>executor(執行緒)>task(例項是如何設定的 l  worker(程序):這個worker程序數量是在叢集啟動之前配置好的,在哪配置的呢?是在storm/conf/storm.yaml檔案中,引數是supervisor.slots.port,如果我們不在這進行配置的話,這個引數也是有預設值的,在strom-0.9.3的壓縮包中的lib目錄下,有一個strom-core.jar,開啟這個jar檔案,在裡面有一個defaults.yaml檔案中是有一些預設配置的。 技術分享 預設情況下一個storm專案只使用一個work程序,也可以通過程式碼進行修改,通過config.setNumWorkers(workers)設定。(最好一臺機器上的一個topology只使用一個worker,主要原因時減少了worker之間的資料傳輸) 注意:如果worker使用完的話再提交topology就不會執行,因為沒有可用的worker,只能處於等待狀態,把之前執行的topology停止一個之後這個就會繼續執行了, 技術分享 l executor(執行緒):預設情況下一個executor執行一個task,可以通過在程式碼中設定builder.setSpout(id,spoutparallelism_hint);或者builder.setBolt(id,bolt,parallelism_hint);來提高執行緒數的。 l task(例項):通過boltDeclarer.setNumTasks(num);來設定例項的個數 預設情況下,一個supervisor節點會啟動4個worker程序。每個worker程序會啟動1個executor,每個executor啟動1個task。 Ok,這幾個引數都可以使用一些方法進行增加。 下面來舉個例子看一下對這些配置修改之後的效果 l  worker(程序),通過在程式碼中設定,可以在ui介面上檢視worker的總數,並且還可以在linux伺服器上執行jps檢視work程序。 技術分享 在程式碼中設定使用3個worker,檢視ui介面,發現workers是3個,executors使用了5個,為什麼呢?因為每一個worker預設都會佔用一個executor(這個executor會啟動一個acker任務),這樣就會佔用三個,剩下的兩個是spout和bolt例項佔用了。 如果使用5個worker,executor會使用7個,因為worker本身就會佔用5個,spout和bolt佔用兩個。 技術分享 Acker任務預設是每個worker程序啟動一個executor執行緒來執行,,可以在topology中取消acker任務,這樣的話就不會多出來一個executor和任務了。 程式碼如下: 實際上就是修改一個配置 topology.acker.executors 技術分享 這樣的話在頁面檢視就只有兩個executor和2個task了。 l  executor(執行緒),在spout和bolt中設定執行緒數,都設定為2個,檢視ui介面 技術分享 現在使用的executor和tasks就是7個了,因為worker本身使用3個,spout和bolt分別使用2個。 技術分享 l  task(例項),在sum中設定例項個數為5,檢視ui介面 技術分享 發現ui介面上顯示的tasks10,因為spout佔用2個,bolt佔用5個,剩下的3個由acker任務佔用 技術分享 注意:雖然在這設定了多個task例項,但是並行度並沒有很大提高,因為只有兩個執行緒去執行這些例項,只有設定足夠多的執行緒和例項才可以真正的提高並行度。 在這設定多個例項主要是為了下面執行rebalance的時候用到,因為rebalance不需要修改程式碼,就可以動態修改topology的並行度,這樣的話就必須提前配置好多個例項,在rebalance的時候主要是對之前設定多餘的任務例項分配執行緒去執行。 在命令列動態修改並行度 除了使用程式碼進行調整,還可以在shell命令列下對並行度進行調整。 storm rebalance mytopology -w 10 -n 2 -e spout=2 -e bolt=2 表示 10秒之後對mytopology進行並行度調整。把spout調整為2個executor,把bolt調整為2個executor 注意:並行度主要就是調整executor的數量,但是調整之後的executor的數量必須小於等於task的數量,如果分配的executor的執行緒數比task數量多的話也只能分配和task數量相等的executor