风暴领域分组

时间:2015-10-10 21:06:31

标签: apache-storm

我遇到以下情况:

  • 有许多计算不同值的螺栓
  • 此值将发送到可视化螺栓
  • 可视化螺栓打开一个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"));

从前面的每个螺栓中发出类型,以便根据它们对它们进行分组?

有什么好处?

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

我认为应该是这种情况,但它目前不在我的实施中,所以我不确定这是一个错误还是我错过了什么?

2 个答案:

答案 0 :(得分:3)

使用三个实例的第一种方法是正确的方法。使用fieldsGrouping 确保“sum”值转到“Sum-Visualization-Bolt”,并且sum / diff / mul值都不相同(即,在不同的bolt实例中)

fieldGrouping的语义更加宽松:它只保证所有相同类型的元组都将由单个螺栓实例处理,即两个不同的螺栓实例永远不会出现这种情况得到相同的类型。

答案 1 :(得分:0)

我想您可以使用部分密钥分组partialKeyGrouping)。在Storm documentation about stream groups上说:

  

部分密钥分组:流按字段划分   在分组中指定,类似于“字段”分组,但已加载   在两个下游螺栓之间保持平衡,从而提供更好的   倾斜输入数据时的资源利用率。这篇报告   很好地解释了它是如何工作的以及它的优点   提供。

我使用此分组实现了一个简单的拓扑,并且与fieldsGrouping相比,Graphite服务器上的图表显示出更好的负载平衡。完整的源代码是here

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())
        ;

enter image description here