【问题标题】:Does Field Grouping ensure strict order?字段分组是否确保严格的顺序?
【发布时间】:2017-11-17 01:01:04
【问题描述】:

我是 Apache Storm 的初学者,想知道什么时候可以保证流中的元组顺序。 当我得到这个帖子Processing records in order in Storm 时,一个螺栓/喷口和另一个螺栓之间的顺序得到保证。

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

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

是否保证总是处理具有 id x 的元组以用于 Bolt。所以 Tuple1 必须在 Bolt1 中处理(严格),然后 Tuple2 在 Bolt1 中处理,如果它们具有相同的 id?严格来说,我的意思是不平行。
即使工作节点发生故障也是如此吗?

【问题讨论】:

    标签: apache-kafka apache-storm


    【解决方案1】:

    这取决于您的拓扑以及“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 分区的顺序到达 Bolt 1。

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

    【讨论】:

    • 我想象的拓扑将类似于 Case1,因为如果它在这种情况下成立,它也将适用于任意拓扑,其中 Bold1 的路径仅包含带有字段分组的粗体。我认为storm在这种情况下甚至可以派上用场。假设 id 标识了一个人,那么仍然可以并行处理不同人的事件。此外,如果按顺序处理人员事件并不重要,则可以有其他路径。
    • 是的,唯一需要注意的是,一旦分组在任何路径上被任何螺栓破坏,就不可能进一步实现顺序完整性。
    猜你喜欢
    • 1970-01-01
    • 2012-09-04
    • 2016-04-17
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    相关资源
    最近更新 更多