2015-05-08 71 views
0

我已閱讀了關於Apache風暴並做了一些基本教程。我有以下的拓撲記住我想實施風暴,但不知道如何處理數據分佈。 業務需求是 實時評估客戶組合。 簡化形式包括: 1)接受市場價格(貨幣,商品等)的實時蒸汽 2)對於每個價格嘀嗒計算每個頭寸的當前利潤並將其轉換爲客戶賬戶幣種 3)分析總客戶數量和每個客戶所有職位的數量,並在需要時產生信號 4)客戶級別的計算必須是順序的和原子級/序列化的。 也就是說所有頭寸必須按照進入系統的順序進行評估,並且必須根據相同的價格計算總額,即使客戶擁有100個頭寸。 5)分析按照符號/客戶類型/國家/等等彙總的系統中所有頭寸的交易量/趨勢,並在某種儀表盤中提供。風暴中的數據並行性

所有訂單都以rdbms執行並存儲。 我的主要問題是如何在風暴螺栓上分佈不同節點上的數千個位置,每個節點都處理它自己的部分。使用Modulo可以很好地對客戶進行分區,但是我如何爲每個螺栓實例提供id,以便每個實例都能處理它自己的平等部分的客戶? Storm有沒有什麼可以做到這一點的? 另一個問題是如何有效地進行以上聚合?

回答

0

您可以使用fieldsGrouping。你可以聲明一個元組被分組的字段(在你的情況下,id)。

我就假設你的輸入流是JSON對象,通過ID和體場中類

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

還假設您的拓撲一個口,兩個螺栓即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")); 

在這種情況下宣佈的拓撲結構,從boltA用同一ID的元組將交付的boltB

+0

相同的情況下,你可以請你回答我的第二個問題是好? –