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は使わなそうなので実装していません。