7

私はStormで遊んでいますが、Stormが(可能であれば)集約時に(タンブリング/スライド)ウィンドウサイズをどこで指定するのか疑問に思っています。たとえば、Twitterで過去1時間のトレンドトピックを検索したい場合。ボルトが1時間ごとに結果を返すように指定するにはどうすればよいですか?これは各ボルト内でプログラム的に行われますか?それとも「ウィンドウ」を指定する方法ですか?

4

2 に答える 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 に答える