Field Grouping是否确保严格的订单?

时间:2017-11-15 23:50:53

标签: apache-kafka apache-storm

我是Apache Storm的初学者,想知道流中是否保证元组的顺序。 当我正确地发布这个帖子Processing records in order in Storm时,保证了Bolt / Spout与其他Bolt之间的顺序。

所以,如果我有KaffkaSpout,它会发出根据时间戳排序的元组,并根据某些id有一些带有字段分组的螺栓。

builder.setBolt("Bolt1", bolt1).fieldsGrouping("Bolt1", new Fields("id")); 

是否保证始终处理具有id x的元组以便使用Bolt。因此,如果在Bolt1中处理Tuple2之前,如果它们具有相同的ID,则必须在Bolt1(严格地)中处理Tuple1?严格来说,我的意思是不平行 即使工作节点出现故障也是如此吗?

1 个答案:

答案 0 :(得分:0)

这取决于您的拓扑结构以及“Bolt1”在相对于KafkaSpout的拓扑中的位置。对于例如考虑以下2种拓扑案例 -

案例1 -

  • builder.setSpout(“KafkaSpout”,Kafkaspout);
  • builder.setBolt(“Bolt1”,bolt1).fieldsGrouping(“KafkaSpout”,new Fields(“id”));

在这种情况下,由于bolt1在拓扑中接下来是kafkaSpout并且具有字段分组,所有具有相同“id”的元组将转到同一个bolt实例,它将按顺序严格。 但请考虑以下拓扑

案例2 -

  • builder.setSpout(“KafkaSpout”,Kafkaspout);
  • builder.setBolt(“Bolt2”,bolt2).shuffleGrouping(“KafkaSpout”);
  • builder.setBolt(“Bolt1”,bolt1).fieldsGrouping(“Bolt2”,new Fields(“id”)); // Bolt2发出的id字段

在这种情况下,由于Bolt2中的订单丢失,因此无法保证元组按照它们被推入Kafka分区的顺序进入第1个。

一般情况下,如果您正在寻找Storm系统中严格的处理顺序,您有责任让所有组件保持正常工作并按顺序排放。但总的来说,这会限制您在许多方面通过限制代码和拓扑中的并行性来使用Storm的全部功能。