Storm中涉及到了很多組件,例如nimbus,supervisor等等,在參考了這兩篇文章之后,對這個有了更好的理解。
Understanding the parallelism of a Storm topology
https://github.com/nathanmarz/storm/wiki/Understanding-the-parallelism-of-a-Storm-topology
http://www.cnblogs.com/yufengof/p/storm-worker-executor-task.html
我們先理一下概念:
- 一般對於物理節點來講,我們部署的節點的類型包括nimbus(master),supervisor(slave),通常是一個nimbus,多個supervisor。nimbus是負責安排任務給supervisor去完成的,即supervisor是實際上干活的。
- 而對於一個supervisor來講,它可以包含多個worker,worker有可以包含多個executor,executor又可以執行多個task。
這樣一說就有點亂,因為這個worker、executor、task和topology,spout和bolt之間又是怎么樣的對應關系呢??
首先看下面一張圖
supervisor和node是一一對應的關系,而worker就是process(進程),executor就是thread(線程),task就是在spout或bolt中定義的函數。
這樣就好理解了,這些從上到下都是一對多的關系。
那supervisor,worker和executor跟topology或component(包括spout和bolt)之間的對應關系呢?
- 一個topology可以在多個supervisor上執行,一個supervisor也可以執行多個topology
- 但是,一個worker只執行某個topology,一個topology由多個worker來執行
- 一個executor可以執行一個component中的多個task,但是一個component可以由多個executor來執行,這就是我們在編程中指定的並發程度。后面會看到。
- 一個executor默認對應一個task
- 一個worker中包含多個executor,但是這些executor不一定都是用來處理同一個component
我們看storm wiki中的一張圖片來解釋
對於這個topology,
- 它包含3個component,1個spout,2個bolt
- 它包含2個worker process,10個executor thread,12個task
- 同顏色屬於同一個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數太少,后期也無法提高太多!
- 第一種方式是使用storm的UI
- 第二種方式是使用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的文章