Topology的代碼如下:
TopologyBuilder builder = new TopologyBuilder();
//WordReaderSpout會從文件中讀取數據,數據用shuffle的方式發送給bolt進行處理
//當文件讀取完成後,會發送一個global消息
builder.setSpout("word-reader",new WordReaderSpout());
builder.setBolt("word-normalizer", new WordNormalizerBolt())
.shuffleGrouping("word-reader")
.globalGrouping("word-reader", "FINISH");
builder.setBolt("word-counter", new WordCounterBolt(),1)
.fieldsGrouping("word-normalizer", new Fields("word"))
.globalGrouping("word-normalizer", "CLOSE");
以globalGrouping爲例:
globalGrouping(“word-reader”, “FINISH”); 兩個參數的含義
第一個參數: “word-reader” 爲componet id, 這個值 與我們代碼的 中的word-reader一致。
builder.setSpout("word-reader",new WordReaderSpout());
第二個參數: “FINISH”爲stream id
這個值是在WordReaderSpout中定義的
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("line"));
declarer.declareStream("FINISH", new Fields("FINISH Reade file"));
}
下面以我們熟知的HashMap爲例,解釋這兩個參數
1) 我們需要定義一個word-reader 的HashMap對象
Map<String, Object> word-reader = new HashMap<String, Object>();
2) 我們調用put兩個對象進去,這兩個對象對應的Key值分別爲default與FINISH
word-reader.put("default", new Object());
word-reader.put("FINISH", new Object());
3) 有其它的對象需要獲取我們put進去的兩個對象,首先就需要先獲取word-reader的Handler。
WordNormalizerBolt word-normalizer = new WordNormalizerBolt();
word-normalizer.setMap(word-reader);
對應到Storm的代碼中,就如下:
1) 首先我們需要創建一個word-reader的對象, —這是bolt代碼
builder.setSpout("word-reader",new WordReaderSpout());
2) 我們需要put兩個對象,這裏與Map可能有點兒差別,因爲需要先聲明。 — 這是spout的代碼
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("line")); //declare()相當於declarer.declareStream(“defalut”, new Fields("line"));
declarer.declareStream("FINISH", new Fields("FINISH Reade file"));
}
而put對象則是在nextTuple()中進行的
public void nextTuple() {
... ...
BufferedReader reader = new BufferedReader(fileReader);
try {
// Read all lines
while ((str = reader.readLine()) != null) {
//put一個key爲"default"的對象
this.collector.emit(new Values(str), str);
}
} catch (Exception e) {
... ...
}
//put一個key爲"FINISH"的對象
this.collector.emit("FINISH", new Values("Finish"));
}
3) bolt獲取Map對象 —- 在TopologyBuilder代碼中實現
builder.setBolt("word-normalizer", new WordNormalizerBolt())
.shuffleGrouping("word-reader")
.globalGrouping("word-reader", "FINISH");