Field Grouping 是否确保严格的顺序?
Does Field Grouping ensure strict order?
我是 Apache Storm 的初学者,想知道何时保证流中元组的顺序。
当我得到 post 正确的 时,Bolt/Spout 和另一个 Bolt 之间的顺序得到保证。
因此,如果我有 KaffkaSpout,它会发出根据时间戳排序的元组,并且有一些 Bolt 会根据某个 id 进行字段分组。
builder.setBolt("Bolt1", bolt1).fieldsGrouping("Bolt1", new Fields("id"));
是否保证始终按顺序处理具有 id x 的元组以获得 Bolt。因此,如果 Tuple1 具有相同的 ID,则必须(严格地)在 Bolt1 中处理 Tuple2 之前在 Bolt1 中对其进行处理?严格来说,我的意思是不平行。
即使工作节点发生故障也是如此吗?
这取决于您的拓扑以及 "Bolt1" 在拓扑中相对于 KafkaSpout 的位置。例如考虑以下 2 种拓扑情况 -
案例 1 -
- builder.setSpout("KafkaSpout", Kafkaspout);
- builder.setBolt("Bolt1", bolt1).fieldsGrouping("KafkaSpout", 新字段("id"));
在这种情况下,由于 bolt1 在拓扑结构中位于 kafkaSpout 的下一个并且具有字段分组,因此具有相同 "id" 的所有元组将转到相同的 bolt 实例,顺序将是严格的。
但是请考虑以下拓扑
案例 2 -
- builder.setSpout("KafkaSpout", Kafkaspout);
- builder.setBolt("Bolt2", bolt2).shuffleGrouping("KafkaSpout");
- builder.setBolt("Bolt1", bolt1).fieldsGrouping("Bolt2", 新字段("id")); //Bolt2发出的id字段
在这种情况下,由于顺序在 Bolt2 中丢失,因此无法保证元组会按照它们被推入 Kafka 分区的顺序到达螺栓 1。
一般来说,如果您在 Storm 系统中寻求严格的处理顺序,您有责任保持所有组件正常工作并按顺序发出。但总的来说,这会通过限制代码和拓扑中的并行性,以多种方式限制您使用 Storm 的全部功能。
我是 Apache Storm 的初学者,想知道何时保证流中元组的顺序。
当我得到 post 正确的
因此,如果我有 KaffkaSpout,它会发出根据时间戳排序的元组,并且有一些 Bolt 会根据某个 id 进行字段分组。
builder.setBolt("Bolt1", bolt1).fieldsGrouping("Bolt1", new Fields("id"));
是否保证始终按顺序处理具有 id x 的元组以获得 Bolt。因此,如果 Tuple1 具有相同的 ID,则必须(严格地)在 Bolt1 中处理 Tuple2 之前在 Bolt1 中对其进行处理?严格来说,我的意思是不平行。
即使工作节点发生故障也是如此吗?
这取决于您的拓扑以及 "Bolt1" 在拓扑中相对于 KafkaSpout 的位置。例如考虑以下 2 种拓扑情况 -
案例 1 -
- builder.setSpout("KafkaSpout", Kafkaspout);
- builder.setBolt("Bolt1", bolt1).fieldsGrouping("KafkaSpout", 新字段("id"));
在这种情况下,由于 bolt1 在拓扑结构中位于 kafkaSpout 的下一个并且具有字段分组,因此具有相同 "id" 的所有元组将转到相同的 bolt 实例,顺序将是严格的。 但是请考虑以下拓扑
案例 2 -
- builder.setSpout("KafkaSpout", Kafkaspout);
- builder.setBolt("Bolt2", bolt2).shuffleGrouping("KafkaSpout");
- builder.setBolt("Bolt1", bolt1).fieldsGrouping("Bolt2", 新字段("id")); //Bolt2发出的id字段
在这种情况下,由于顺序在 Bolt2 中丢失,因此无法保证元组会按照它们被推入 Kafka 分区的顺序到达螺栓 1。
一般来说,如果您在 Storm 系统中寻求严格的处理顺序,您有责任保持所有组件正常工作并按顺序发出。但总的来说,这会通过限制代码和拓扑中的并行性,以多种方式限制您使用 Storm 的全部功能。