0

Apache ストームについて読み、いくつかの基本的なチュートリアルを行いました。次のトポロジを念頭に置いて、ストームで実装したいのですが、データ配布の処理方法がわかりません。ビジネス要件は、顧客のポートフォリオをリアルタイムで評価することです。1) 市場価格 (通貨、コモディティなど) のライブ ストリームを受け入れる 2) 価格ティックごとに、すべてのポジションの現在の利益を計算し、それを顧客アカウントの通貨に変換する 3) 合計 p/l を分析するおよび顧客ごとのすべてのポジションのボリュームと、必要に応じてシグナルを生成します。つまり、すべてのポジションは、システムに入力された注文のすべてのティックで評価する必要があり、顧客が数百のポジションを持っている場合でも、同じ価格に基づいて合計を計算する必要があります。

すべての注文が実行され、rdbms に保存されます。私の主な質問は、すべてのノードが独自の部分を処理するさまざまなノード上のストーム ボルトに何十万ものポジションを分散する方法です。Modulo を使用すると、顧客を分割するのに十分ですが、どのようにボルトのすべてのインスタンスに id を提供して、それぞれが顧客の等しい部分のみを処理することができますか? それを行うためのStormのすぐに使えるものはありますか? 別の質問は、上記の集計を効率的に行う方法ですか?

4

1 に答える 1

0

そのために使用できますfieldsGrouping。タプルをグループ化するフィールドを宣言できます(あなたの場合はid)。

入力ストリームは、次のような id と body フィールドを持つ JSON オブジェクトであると仮定します

{"id":"1234","body":"some body"}

また、トポロジに 1 つのスパウトと 2 つのボルト、つまり BoltA と BoltB があるとします。

BoltB で、declareOutputFields メソッドをオーバーライドし、詳細を入力します。

public void declareOutputFields(OutputFieldsDeclarer declarer) {
    declarer.declare(new Fields("id","log"));
}

そして、以下のようにトポロジを宣言できます

TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("spout", spout, 1);
builder.setBolt("boltA", new BoltA(), 1)
       .shuffleGrouping("spout");
builder.setBolt("counterBolt", new BoltB(), 1).fieldsGrouping("boltB", new Fields("id"));

この場合、同じ ID を持つタプルは、boltA同じインスタンスに配信されます。boltB

于 2015-05-14T01:19:46.993 に答える