StormのTopologyをグラフにして見る(手抜き

StormのTopologyBuilderの設計はいまいち好きじゃないんですが(idで指定なのと、setBolt・setSpoutが分かれているところ)、それはともかく、できあがったTopologyはグラフにしないとパッと理解できないので、Pythonで適当に書いてみました。

    builder = TopologyBuilder()
    builder.setSpout(1, Spout())
    builder.setBolt(2, Bolt()).allGrouping(0)
    builder.graphviz_format()
digraph topology {
1 [shape=box, label="1@Spout x(default)"];
2 [label="2@Bolt x(default)"];
1 -> 2 [label="all"];
}

    class TestWordSpout(Spout):
        pass
    class ExclamationBolt(Bolt):
        pass
    builder = TopologyBuilder()        
    builder.setSpout(1, TestWordSpout(), 10)        
    builder.setBolt(2, ExclamationBolt(), 3).shuffleGrouping(1)
    builder.setBolt(3, ExclamationBolt(), 2).shuffleGrouping(2)
    builder.graphviz_format()
digraph topology {
1 [shape=box, label="1@TestWordSpout x10"];
2 [label="2@ExclamationBolt x3"];
3 [label="3@ExclamationBolt x2"];
1 -> 2 [label="shuffle"];
2 -> 3 [label="shuffle"];
}

    class RandomSentenceSpout(Spout):
        pass
    class SplitSentence(Bolt):
        pass
    class WordCount(Bolt):
        pass
    builder = TopologyBuilder()
    builder.setSpout(1, RandomSentenceSpout(), 5)        
    builder.setBolt(2, SplitSentence(), 8).shuffleGrouping(1)
    builder.setBolt(3, WordCount(), 12).fieldsGrouping(2, Fields("word"))
    builder.graphviz_format()
digraph topology {
1 [shape=box, label="1@RandomSentenceSpout x5"];
2 [label="2@SplitSentence x8"];
3 [label="3@WordCount x12"];
1 -> 2 [label="shuffle"];
2 -> 3 [label="fields[word]"];
}

だいぶわかりやすいですね。

TopologyBuilderは

TopologyBuilder builder = new TopologyBuilder();
        
builder.setSpout(1, new RandomSentenceSpout(), 5);        
builder.setBolt(2, new SplitSentence(), 8)
        .shuffleGrouping(1);
builder.setBolt(3, new WordCount(), 12)
        .fieldsGrouping(2, new Fields("word"));

より

TopologyBuilder builder = new TopologyBuilder();
builder.set("random_sentence_spout", 
        new Node(new RandomSentenceSpout()).setPallalelismHint(5));
builder.set("split_sentence", 
        new Node(new SplitSentence()).setPallalelismHint(8).shuffleGrouping("random_sentence_spout")) ; 
builder.set("word_count", 
        new Node(new WordCount()).setPallalelismHint(12).fieldGrouping("split_sentence", new Fields("word"))) ; 

とかのほうがわかりやすいような気がしますが、僕はもう少し抽象的な定義からTopologyを生成して使おうとしているので、出来上がりさえ検証できれば問題ないですね。

コード

InputDeclarerのstreamIdは使わなそうなので実装していません。