私はStormで遊んでいますが、Stormが(可能であれば)集約時に(タンブリング/スライド)ウィンドウサイズをどこで指定するのか疑問に思っています。たとえば、Twitterで過去1時間のトレンドトピックを検索したい場合。ボルトが1時間ごとに結果を返すように指定するにはどうすればよいですか?これは各ボルト内でプログラム的に行われますか?それとも「ウィンドウ」を指定する方法ですか?
質問する
4628 次
2 に答える
17
免責事項:上記の回答でgakhovが参照している「TrendingTopicswithStorm」の記事を書きました。
ベストプラクティスは、 Storm0.8+でいわゆるティックタプルを使用することだと思います。これらを使用すると、特定の時間間隔(たとえば、10秒ごとまたは1分ごと)で通知されるように独自の注ぎ口/ボルトを構成できます。
これは、10秒ごとにティックタプルを受信するように問題のコンポーネントを構成する簡単な例です。
// in your spout/bolt
@Override
public Map<String, Object> getComponentConfiguration() {
Config conf = new Config();
int tickFrequencyInSeconds = 10;
conf.put(Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS, tickFrequencyInSeconds);
return conf;
}
次に、スパウト/ボルトのexecute()
メソッドで条件付きスイッチを使用して、「通常の」着信タプルと特別なティックタプルを区別できます。例えば:
// in your spout/bolt
@Override
public void execute(Tuple tuple) {
if (isTickTuple(tuple)) {
// now you can trigger e.g. a periodic activity
}
else {
// do something with the normal tuple
}
}
private static boolean isTickTuple(Tuple tuple) {
return tuple.getSourceComponent().equals(Constants.SYSTEM_COMPONENT_ID)
&& tuple.getSourceStreamId().equals(Constants.SYSTEM_TICK_STREAM_ID);
}
繰り返しになりますが、gakhovが指摘したように、私は数日前にStormでこれを行うことについてかなり詳細なブログ投稿を書きました(恥知らずなプラグ!)。
于 2013-02-06T18:38:28.930 に答える
1
並列度が1の新しい注ぎ口を追加し、空の信号を出力してから、次回までUtils.sleepを発行します(すべてnextTupleで実行されます)。次に、all-groupingを使用して、関連するすべてのボルトをその注ぎ口にリンクします。これにより、すべてのインスタンスが同じ信号を受信します。
于 2012-11-02T23:43:03.897 に答える