Storm 基礎 -- spout與bolt設置多重grouping

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");

最後附上源碼:http://download.csdn.net/detail/eyoulc123/9514466

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章