Apache storm 风暴场分组

Apache storm 风暴场分组,apache-storm,Apache Storm,我的情况如下: 有许多螺栓可以计算不同的值 这些值将发送到可视化螺栓 可视化螺栓打开一个web套接字,并以某种方式发送要可视化的值 问题是,可视化螺栓始终是相同的,但它会为每种类型的螺栓发送一条具有不同标题的消息,这些螺栓可以作为其输入。例如: BoltSum计算和 BoltDif计算差异 BoltMul计算倍数 所有这些螺栓都使用VisualizationBolt进行可视化 本例中有3个VisualizationBolt实例 我的问题是,我应该创建3个独立的实例,每个实例都有一个线程,

我的情况如下:

  • 有许多螺栓可以计算不同的值
  • 这些值将发送到可视化螺栓
  • 可视化螺栓打开一个web套接字,并以某种方式发送要可视化的值
问题是,可视化螺栓始终是相同的,但它会为每种类型的螺栓发送一条具有不同标题的消息,这些螺栓可以作为其输入。例如:

  • BoltSum计算和
  • BoltDif计算差异
  • BoltMul计算倍数

  • 所有这些螺栓都使用VisualizationBolt进行可视化

  • 本例中有3个VisualizationBolt实例
我的问题是,我应该创建3个独立的实例,每个实例都有一个线程,例如

builder.setBolt("forSum", new VisualizationBolt(),1).globalGrouping("bolt-sum");
builder.setBolt("forDif", new VisualizationBolt(),1).globalGrouping("bolt-dif");
builder.setBolt("forMul", new VisualizationBolt(),1).globalGrouping("bolt-mul");
或者我应该做以下事情

builder.setBolt("forAll", new VisualizationBolt(),3)
.fieldsGrouping("forSum", new Fields("type"))
.fieldsGrouping("forDif", new Fields("type"))
.fieldsGrouping("forMul", new Fields("type"));
并从前面的每个螺栓发出类型,以便可以基于该类型对它们进行分组

有什么好处

此外,我是否应该期望每次螺栓总和都将转到第一个可视化螺栓,螺栓dif将转到第二个可视化螺栓,螺栓mul将转到第三个可视化螺栓?他们不会混在一起吗


我认为应该是这样,但目前我的实现中没有,所以我不确定这是一个bug还是我遗漏了什么?

使用三个实例的第一种方法是正确的方法。使用
字段分组
可以确保“总和”值转到“总和可视化螺栓”,并且总和/差别/多重值都不不同(即,在不同螺栓实例中)


fieldGrouping
的语义更为宽松:它只保证同一类型的所有元组将由一个bolt实例处理,也就是说,两个不同的bolt实例获得相同的类型永远不会是这样。

我想你可以使用部分键分组
partialKeyGrouping
)。报纸上说:

部分密钥分组:流按字段进行分区 在分组中指定,与字段分组类似,但为加载 在两个下游螺栓之间保持平衡,从而提供更好的 传入数据倾斜时的资源利用率。本报 很好地解释了它的工作原理及其优点 提供

我使用这个分组实现了一个简单的拓扑,Graphite服务器上的图表显示,与
fieldsGroup
相比,它具有更好的负载平衡。完整的源代码是


哦,我明白了,那么和和和差有可能归一个螺栓吗?这就是我遇到的问题,以前的螺栓的输出是混合的,即使我按字段分组。一个螺栓实例可以获得多种类型(使用
字段分组
,只有一种类型不会转到不同的实例)非常感谢,先生,我现在就知道了。我认为分配会更“公平”,因为有X螺栓和X键,这样每个螺栓都会得到一个键的实例,但现在我明白了,情况并非如此。很高兴通过我的两个问题与您进行讨论。:)干杯此处正确解释了字段分组:
topologyBuilder.setBolt(MqttSensors.BOLT_SENSOR_TYPE.getValue(), new SensorAggregateValuesWindowBolt().withTumblingWindow(Duration.seconds(5)), 2)
        // .fieldsGrouping(MqttSensors.SPOUT_STATION_01.getValue(), new Fields(MqttSensors.FIELD_SENSOR_TYPE.getValue()))
        // .fieldsGrouping(MqttSensors.SPOUT_STATION_02.getValue(), new Fields(MqttSensors.FIELD_SENSOR_TYPE.getValue()))
        .partialKeyGrouping(MqttSensors.SPOUT_STATION_01.getValue(), new Fields(MqttSensors.FIELD_SENSOR_TYPE.getValue()))
        .partialKeyGrouping(MqttSensors.SPOUT_STATION_02.getValue(), new Fields(MqttSensors.FIELD_SENSOR_TYPE.getValue()))
        .setNumTasks(4) // This will create 4 Bolt instances 
        .addConfiguration(TagSite.SITE.getValue(), TagSite.EDGE.getValue())
        ;