Storm并行度详解
生活随笔
收集整理的這篇文章主要介紹了
Storm并行度详解
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、Storm并行度相關(guān)的概念
Storm集群有很多節(jié)點(diǎn),按照類型分為nimbus(主節(jié)點(diǎn))、supervisor(從節(jié)點(diǎn)),在conf/storm.yaml中配置了一個(gè)supervisor,有多個(gè)槽(supervisor.slots.ports),每個(gè)槽就是一個(gè)JVM,就是一個(gè)worker(一個(gè)節(jié)點(diǎn),運(yùn)行一個(gè)worker),在每個(gè)worker里面可以運(yùn)行多個(gè)線程叫做executor,在executor里運(yùn)行一個(gè)topology的一個(gè)component(spout、bolt)叫做task。task??是storm中進(jìn)行計(jì)算的最小的運(yùn)行單位,表示是spout或者bolt的運(yùn)行實(shí)例。
總結(jié)一下,supervisor(節(jié)點(diǎn))>worker(進(jìn)程)>executor(線程)>task(實(shí)例)
程序執(zhí)行的最大粒度的運(yùn)行單位是進(jìn)程,剛才說的task也是需要有進(jìn)程來運(yùn)行它的,在supervisor中,運(yùn)行task的進(jìn)程稱為worker, Supervisor節(jié)點(diǎn)上可以運(yùn)行非常多的worker進(jìn)程,一般在一個(gè)進(jìn)程中是可以啟動(dòng)多個(gè)線程的,所以我們可以在worker中運(yùn)行多個(gè)線程,這些線程稱為executor,在executor中運(yùn)行task。 提高storm的并行度,可 考慮如下幾點(diǎn): worker(進(jìn)程)>executor(線程)>task(實(shí)例) 增加work進(jìn)程,增加executor線程,增加task實(shí)例 看下面的圖: 這表示是一個(gè)work進(jìn)程,其實(shí)就是一個(gè)jvm虛擬機(jī)進(jìn)程,在這個(gè)work進(jìn)程里面有多個(gè)executor線程,每個(gè)executor線程會(huì)運(yùn)行一個(gè)或多個(gè)task實(shí)例。一個(gè)task是最終完成數(shù)據(jù)處理的實(shí)體單元。(默認(rèn)情況下一個(gè)executor運(yùn)行一個(gè)task). worker,executor,task解釋 1個(gè)worker進(jìn)程執(zhí)行的是1個(gè)topology的子集(注:不會(huì)出現(xiàn)1個(gè)worker為多個(gè)topology服務(wù))。1個(gè)worker進(jìn)程會(huì)啟動(dòng)1個(gè)或多個(gè)executor線程來執(zhí)行1個(gè)topology的component(spout或bolt)。因此,1個(gè)運(yùn)行中的topology就是由集群中多臺(tái)物理機(jī)上的多個(gè)worker進(jìn)程組成的。 executor是1個(gè)被worker進(jìn)程啟動(dòng)的單獨(dú)線程。每個(gè)executor只會(huì)運(yùn)行1個(gè)topology的1個(gè)component(spout或bolt)的task(注:task可以是1個(gè)或多個(gè),storm默認(rèn)是1個(gè)component只生成1個(gè)task,executor線程里會(huì)在每次循環(huán)里順序調(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。 剛才從理論說明了如何提高集群的并行度,在這里我們就來看一下這些東西worker(進(jìn)程)>executor(線程)>task(實(shí)例)?是如何設(shè)置的 l??worker(進(jìn)程):這個(gè)worker進(jìn)程數(shù)量是在集群?jiǎn)?dòng)之前配置好的,在哪配置的呢?是在storm/conf/storm.yaml文件中,參數(shù)是supervisor.slots.port,如果我們不在這進(jìn)行配置的話,這個(gè)參數(shù)也是有默認(rèn)值的,在strom-1.0.2的壓縮包中的lib目錄下,有一個(gè)strom-core.jar,打開這個(gè)jar文件,在里面有一個(gè)defaults.yaml文件中是有一些默認(rèn)配置的。 默認(rèn)情況下一個(gè)storm項(xiàng)目只使用一個(gè)work進(jìn)程,也可以通過代碼進(jìn)行修改,通過config.setNumWorkers(workers)設(shè)置。(最好一臺(tái)機(jī)器上的一個(gè)topology只使用一個(gè)worker,主要原因時(shí)減少了worker之間的數(shù)據(jù)傳輸) 注意:如果worker使用完的話再提交topology就不會(huì)執(zhí)行,因?yàn)闆]有可用的worker,只能處于等待狀態(tài),把之前運(yùn)行的topology停止一個(gè)之后這個(gè)就會(huì)繼續(xù)執(zhí)行了, l executor(線程):默認(rèn)情況下一個(gè)executor運(yùn)行一個(gè)task,可以通過在代碼中設(shè)置builder.setSpout(id,spout,?parallelism_hint);或者builder.setBolt(id,bolt,parallelism_hint);來提高線程數(shù)的。 l task(實(shí)例):通過boltDeclarer.setNumTasks(num);來設(shè)置實(shí)例的個(gè)數(shù) 默認(rèn)情況下,一個(gè)supervisor節(jié)點(diǎn)會(huì)啟動(dòng)4個(gè)worker進(jìn)程。每個(gè)worker進(jìn)程會(huì)啟動(dòng)1個(gè)executor,每個(gè)executor啟動(dòng)1個(gè)task。 Ok,這幾個(gè)參數(shù)都可以使用一些方法進(jìn)行增加。二、示例說明
下面來舉個(gè)例子看一下對(duì)這些配置修改之后的效果1、worker(進(jìn)程)
通過在代碼中設(shè)置,可以在ui界面上查看worker的總數(shù),并且還可以在linux服務(wù)器上執(zhí)行jps查看work進(jìn)程。 在代碼中設(shè)置使用3個(gè)worker,查看ui界面,發(fā)現(xiàn)workers是3個(gè),executors使用了5個(gè),為什么呢?因?yàn)槊恳粋€(gè)worker默認(rèn)都會(huì)占用一個(gè)executor(這個(gè)executor會(huì)啟動(dòng)一個(gè)acker任務(wù)),這樣就會(huì)占用三個(gè),剩下的兩個(gè)是spout和bolt實(shí)例占用了。 如果使用5個(gè)worker,executor會(huì)使用7個(gè),因?yàn)閣orker本身就會(huì)占用5個(gè),spout和bolt占用兩個(gè)。 Acker任務(wù): acker任務(wù)默認(rèn)是每個(gè)worker進(jìn)程啟動(dòng)一個(gè)executor線程來執(zhí)行,可以在topology中取消acker任務(wù),這樣的話就不會(huì)多出來一個(gè)executor和任務(wù)了。?
或
實(shí)際上就是修改TOPOLOGY_ACKER_EXECUTORS配置,如下: // storm配置 Config stormConf = new Config(); stormConf.TOPOLOGY_ACKER_EXECUTORS = 0;//關(guān)閉 這樣的話在頁(yè)面查看executor和task的個(gè)數(shù)一樣了。2、 executor(線程)
在spout和bolt中設(shè)置線程數(shù),都設(shè)置為2個(gè),查看ui界面 現(xiàn)在使用的executor和tasks就是7個(gè)了,因?yàn)閣orker本身使用3個(gè),spout和bolt分別使用2個(gè)。3、 task(實(shí)例)
在sum中設(shè)置實(shí)例個(gè)數(shù)為5,查看ui界面 發(fā)現(xiàn)ui界面上顯示的tasks是10,因?yàn)閟pout占用2個(gè),bolt占用5個(gè),剩下的3個(gè)由acker任務(wù)占用 注意:雖然在這設(shè)置了多個(gè)task實(shí)例,但是并行度并沒有很大提高,因?yàn)橹挥袃蓚€(gè)線程去運(yùn)行這些實(shí)例,只有設(shè)置足夠多的線程和實(shí)例才可以真正的提高并行度。 在這設(shè)置多個(gè)實(shí)例主要是為了下面執(zhí)行rebalance的時(shí)候用到,因?yàn)閞ebalance不需要修改代碼,就可以動(dòng)態(tài)修改topology的并行度,這樣的話就必須提前配置好多個(gè)實(shí)例,在rebalance的時(shí)候主要是對(duì)之前設(shè)置多余的任務(wù)實(shí)例分配線程去執(zhí)行。三、在命令行中動(dòng)態(tài)修改并行度
除了使用代碼進(jìn)行調(diào)整,還可以在shell命令行下對(duì)并行度進(jìn)行調(diào)整。 storm rebalance mytopology -w 10 -n 2 -e spout=2 -e bolt=2 表示 10秒之后對(duì)mytopology進(jìn)行并行度調(diào)整。把spout調(diào)整為2個(gè)executor,把bolt調(diào)整為2個(gè)executor。 注意:并行度主要就是調(diào)整executor的數(shù)量,但是調(diào)整之后的executor的數(shù)量必須小于等于task的數(shù)量,如果分配的executor的線程數(shù)比task數(shù)量多的話也只能分配和task數(shù)量相等的executor。總結(jié)
以上是生活随笔為你收集整理的Storm并行度详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 线程 Thread 使用介绍,
- 下一篇: strace使用详解(未研究)