我遇到以下情况:
问题是,可视化螺栓始终是相同的,但它会为每种类型的螺栓发送一个带有不同标题的消息,这些螺栓可以作为其输入。例如:
BoltMul计算多个
所有这些螺栓都使用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将转到第三个可视化螺栓?他们不会混在一起吗?
我认为应该是这种情况,但它目前不在我的实施中,所以我不确定这是一个错误还是我错过了什么?
答案 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())
;