Storm中併發程度的理解

Storm中涉及到了不少組件,例如nimbus,supervisor等等,在參考了這兩篇文章以後,對這個有了更好的理解。html

Understanding the parallelism of a Storm topologynode

https://github.com/nathanmarz/storm/wiki/Understanding-the-parallelism-of-a-Storm-topologygit

http://www.cnblogs.com/yufengof/p/storm-worker-executor-task.htmlgithub

 

咱們先理一下概念:編程

  1. 通常對於物理節點來說,咱們部署的節點的類型包括nimbus(master),supervisor(slave),一般是一個nimbus,多個supervisor。nimbus是負責安排任務給supervisor去完成的,即supervisor是實際上幹活的。
  2. 而對於一個supervisor來說,它能夠包含多個worker,worker有能夠包含多個executor,executor又能夠執行多個task。

這樣一說就有點亂,由於這個worker、executor、task和topology,spout和bolt之間又是怎麼樣的對應關係呢??併發

首先看下面一張圖函數

               

supervisor和node是一一對應的關係,而worker就是process(進程),executor就是thread(線程),task就是在spout或bolt中定義的函數。ui

這樣就好理解了,這些從上到下都是一對多的關係。編碼

那supervisor,worker和executor跟topology或component(包括spout和bolt)之間的對應關係呢?spa

  1. 一個topology能夠在多個supervisor上執行,一個supervisor也能夠執行多個topology
  2. 可是,一個worker只執行某個topology,一個topology由多個worker來執行
  3. 一個executor能夠執行一個component中的多個task,可是一個component能夠由多個executor來執行,這就是咱們在編程中指定的併發程度。後面會看到。
  4. 一個executor默認對應一個task
  5. 一個worker中包含多個executor,可是這些executor不必定都是用來處理同一個component

 

咱們看storm wiki中的一張圖片來解釋

                    

 

對於這個topology,

  1. 它包含3個component,1個spout,2個bolt
  2. 它包含2個worker process,10個executor thread,12個task
  3. 同顏色屬於同一個component
 1 Config conf = new Config();
 2 conf.setNumWorkers(2); // use two worker processes
 3 
 4 topologyBuilder.setSpout("blue-spout", new BlueSpout(), 2); // set parallelism hint to 2
 5 
 6 topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2)
 7                .setNumTasks(4)
 8                .shuffleGrouping("blue-spout");
 9 
10 topologyBuilder.setBolt("yellow-bolt", new YellowBolt(), 6)
11                .shuffleGrouping("green-bolt");
12 
13 StormSubmitter.submitTopology(
14         "mytopology",
15         conf,
16         topologyBuilder.createTopology()
17     );

代碼如上,worker process,executor thread,task這些的數目均可以進行設置。

因此接下來咱們應該會關心一個topology默認對應的worker數是多少?一個executor默認對應的task數是多少?

 

更重要的是,咱們在編碼過程當中已經指定了worker process數和exector thread數,可是這兩個數能夠在運行時被修改,以更好地適應負載的變化!這樣的方式叫作rebalance!

它可以修改worker的數目,也就是說咱們是否能夠經過監控,來實現自動水平拓展呢??例如結合IaaS,加一個supervisor節點加入到集羣中?同時啓動對應的worker進程,當負載低的時候,收回對應的supervisor節點,將虛擬機返回到對應的VM池裏呢??

注意一點是:Task的數目在啓動後就不能變了,可是能夠改executor,即執行的線程數,因此executor數必定是小於等於task數,才能保證每個executor至少有一個task能夠運行.

因此對於task數太少,後期也沒法提升太多!

  1. 第一種方式是使用storm的UI
  2. 第二種方式是使用CLI tool來修改
# Reconfigure the topology "mytopology" to use 5 worker processes,
# the spout "blue-spout" to use 3 executors and
# the bolt "yellow-bolt" to use 10 executors.

$ storm rebalance mytopology -n 5 -e blue-spout=3 -e yellow-bolt=10

具體請參考wiki的文章

相關文章
相關標籤/搜索