gpt4 book ai didi

apache-storm - emit() 和多个 tick 元组如何在 Storm 中起作用?

转载 作者:行者123 更新时间:2023-12-04 04:21:03 25 4
gpt4 key购买 nike

我有一个拓扑并在本地模式下运行它,例如 Spout A ---> Bolt B ---> Bolt C。此外,我定义了一个对象Object D,它是B向C发出的值。我有两个问题:

  1. 我在 Bolt B 中设置了 TOPOLOGY_TICK_TUPLE_FREQ_SECS,并在创建 Bolt B 时设置了新的 Object D。当 TupleHelpers.isTickTuple(input)true 时,它会向 Bolt C 发出 Object D。我认为 Storm 会克隆 Object D 并在 Bolt C 中生成一个新的,但是,当我尝试更新 Object D 的内容时>,它仍然在 Bolt B 中发生变化。为什么?这两个 bolt 可能在不同的服务器上,并且不可能在多个 bolt 之间共享内存中的相同变量。

bolt B

private final UserPreferBean userPrefer;
public FirstBolt() {
this.keyword = "Default";
this.userPrefer = new UserPreferBean();
this.userPrefer.setAction("Action");
this.userPrefer.setActor("Actor");
}
@Override
public void execute(Tuple input, BasicOutputCollector collector) {
if (TupleHelpers.isTickTuple(input)) {
System.out.println("FirstBolt.Tick.keyword= " + userPrefer.getAction());
collector.emit(new Values(userPrefer));
} else {
}
}

bolt C

@Override
public void execute(Tuple input, BasicOutputCollector collector) {
UserPreferBean userPrefer = (UserPreferBean) input.getValue(0);
System.out.println("SecondBolt.keyword= " + userPrefer.getAction());
userPrefer.setAction("NewAction");
System.out.println("SecondBolt.new.keyword= " + userPrefer.getAction());
}
  1. 当我在 Bolt BBolt C 中设置 TOPOLOGY_TICK_TUPLE_FREQ_SECS 时 Storm 如何运作。由于bolt CBolt B之后,那么在多个bolt中设置TOPOLOGY_TICK_TUPLE_FREQ_SECS是否没有意义?

最佳答案

对于您的第一个问题,您应该为每次发射创建新的元组数据,因为无法保证在您想要发射另一个元组之前数据将被序列化以进行传输。如果不这样做,您最终可能会在所有先前发出但未提交的元组上加盖戳记。至于 bolt C 获得与 bolt B 发出的相同对象,我猜测这只是 Storm 在两个 bolt 位于同一 JVM 中时使用的性能技巧。如果这两个对象在不同的​​机器上,您显然不会得到它。这是更新要发射的对象的另一个原因。

对于您的第二个问题,TOPOLOGY_TICK_TUPLE_FREQ_SECS 配置用于向您的 bolt 发送额外的刻度元组——高于通过上游 bolt 发送至 bolt 的任何其他元组。这意味着您可以将 tick 元组发送到任意数量的组件,只要它对您的拓扑设计有意义即可。

关于apache-storm - emit() 和多个 tick 元组如何在 Storm 中起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30014310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com