当前位置: 首页 > 知识库问答 >
问题:

emit()和多个tick元组在Storm中是如何操作的?

鲜于玮
2023-03-14

我有一个拓扑并在本地模式下运行它,比如spout a-->bolt-->boltC。而且,我定义了一个对象对象D,它是从B到C发出的值。我有两个问题:

  1. 我在bolt b中设置topology_tick_tuple_freq_secs并在创建bolt b时设置新的对象d。当TupleHelpers.isTickTuple(input)true时,它将对象D发送到螺栓C。我认为Storm会克隆对象D并在bolt c中生成一个新的,然而,当我试图更新对象D的内容时,它仍然在bolt c中发生变化。为什么?这两个bolt可能位于不同的服务器中,并且不可能在多个bolt之间共享内存中的相同变量。
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 {
    }
}
@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个答案

裴英锐
2023-03-14

对于您的第一个问题,您应该为每个发出的元组数据添加新的元组数据,因为在您想要发出另一个元组之前,不能保证这些数据将被序列化以用于传输。如果不这样做,您可能会在以前发出但未提交的元组上打戳。至于bolt C得到的对象与bolt B发出的对象相同,我猜这只是当两个bolt在同一个JVM中时,Storm使用的性能技巧。如果这两个对象在不同的机器上,您显然不会得到这一点。这是另一个要发射新对象的原因。

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

 类似资料: