Apache storm 风暴中的数据并行

Apache storm 风暴中的数据并行,apache-storm,computational-finance,Apache Storm,Computational Finance,我已经阅读了有关Apache storm的内容,并做了一些基本教程。我想用storm实现以下拓扑,但不确定如何处理数据分布。 业务需求是 实时评估客户的投资组合。 简而言之,它包括: 1) 接受市场价格(货币、商品等)的动态变化 2) 对于每个价格勾选,计算每个头寸的当前利润,并将其转换为客户账户货币 3) 分析每个客户所有头寸的总损益和交易量,并根据需要生成信号 4) 在客户级别,计算必须是连续的、原子的/序列化的。 即,所有头寸必须按照其进入系统的顺序进行评估,并且即使客户有100个头寸,也

我已经阅读了有关Apache storm的内容,并做了一些基本教程。我想用storm实现以下拓扑,但不确定如何处理数据分布。 业务需求是 实时评估客户的投资组合。 简而言之,它包括: 1) 接受市场价格(货币、商品等)的动态变化 2) 对于每个价格勾选,计算每个头寸的当前利润,并将其转换为客户账户货币 3) 分析每个客户所有头寸的总损益和交易量,并根据需要生成信号 4) 在客户级别,计算必须是连续的、原子的/序列化的。 即,所有头寸必须按照其进入系统的顺序进行评估,并且即使客户有100个头寸,也必须根据相同的价格计算总额。 5) 按符号/客户类型/国家/地区等分析系统中所有职位的数量/趋势。。。并使它们在某种仪表板中可用

所有订单都执行并存储在rdbms中。 我的主要问题是如何在每个节点处理自己部分的不同节点上的风暴螺栓上分配100个数千个位置。使用模对客户进行分区已经足够好了,但是我怎样才能为每个bolt实例提供id,使它们中的每个都只处理自己的相等部分客户呢?在暴风雨中有什么现成的东西可以做到这一点吗?
另一个问题是如何有效地进行上述聚合?

您可以使用
字段分组。您可以声明元组分组所依据的字段(在您的示例中,
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

的同一个实例,您能回答我的第二个问题吗?