Topology(拓撲):Spout、Bolt組成的一個完整的流程結構;java
Stream Grouping:流分組、數據的分發方式;ui
Spout:直譯 水龍頭,也就是 消息源 的意思;spa
Bolt:螺栓、處理器。很形象,水從上面的那個「水龍頭」流出來,通過第一個螺栓,通過第二個螺栓,通過第三第四個螺栓...線程
Worker:工做進程3d
Executor:執行器、task的線程;code
Task:具體執行的任務;orm
Configuration:配置。blog
在上上節(55節),本地模式跑起來的,只有一個JVM(雖然分配了兩個,cfg.setNumWorkers(2); 可是在本地跑的時候只可能啓動一個JVM),那麼拓撲的執行狀況應該是下面這樣的,一個worker下有幾個Executor,每一個Executor分別對應一個Spout或者Bolt(圖片中的bolt和Spout名稱和代碼不一致,請對號入座):進程
若是咱們把帶碼稍做改動(只須要改Topology)圖片
1 import backtype.storm.Config; 2 import backtype.storm.LocalCluster; 3 import backtype.storm.StormSubmitter; 4 import backtype.storm.topology.TopologyBuilder; 5 import bhz.bolt.PrintBolt; 6 import bhz.bolt.WriteBolt; 7 import bhz.spout.PWSpout; 8 9 public class PWTopology2 { 10 11 public static void main(String[] args) throws Exception { 12 13 Config cfg = new Config(); 14 cfg.setNumWorkers(2);//設置使用倆個工做進程 15 cfg.setDebug(false); 16 TopologyBuilder builder = new TopologyBuilder(); 17 //設置sqout的並行度和任務數(產生2個執行器和倆個任務) 18 builder.setSpout("spout", new PWSpout(), 2);//.setNumTasks(2); 19 //設置bolt的並行度和任務數:(產生2個執行器和4個任務) 20 builder.setBolt("print-bolt", new PrintBolt(), 2).shuffleGrouping("spout").setNumTasks(4); 21 //設置bolt的並行度和任務數:(產生6個執行器和6個任務) 22 builder.setBolt("write-bolt", new WriteBolt(), 6).shuffleGrouping("print-bolt"); 23 24 25 //1 本地模式 26 // LocalCluster cluster = new LocalCluster(); 27 // cluster.submitTopology("top2", cfg, builder.createTopology()); 28 // Thread.sleep(10000); 29 // cluster.killTopology("top2"); 30 // cluster.shutdown(); 31 32 //2 集羣模式 33 StormSubmitter.submitTopology("top2", cfg, builder.createTopology()); 34 35 } 36 }
1.談談本地爲何會生成那麼多文件
若是咱們以本地模式啓動,那麼運行結果將會是這樣的,temp文件夾裏有6個文件
那麼爲何會產生6個文件呢?注意代碼的第22行
這裏設置6個執行器來執行WriteBolt,默認每一個執行器是一個task,也就是有6個task;再來看看WriteBolt是怎麼造成文件的:
能夠看出,每一個線程都會在099_test下造成一個文件。
2.spout部分的拓撲結構調整
假如,咱們只修改這一行代碼
那麼在只有一個JVM的狀況下,總體拓撲結構應該相似這樣的:
3.若是徹底修改爲上面的代碼,而且能夠啓動多個JVM的話,呢麼拓撲結構應該是下面這樣的(圖片中的bolt和Spout名稱和代碼不一致,請對號入座):
針對上面的這種拓撲結構的總結:
遇到一點問題,storm supervisor & 啓動報錯java.lang.RuntimeException: java.io.EOFException:
解決辦法:刪除storm.yaml中配置的storm.local.dir指向的目錄中的supervisor和workers兩個目錄,再次啓動便可。