Apache storm emit()和多个tick元组在storm中是如何工作的?

Apache storm emit()和多个tick元组在storm中是如何工作的?,apache-storm,Apache Storm,我有一个拓扑,并在本地模式下运行它,比如喷口a-->螺栓B-->螺栓C。此外,我定义了一个对象对象D,它是从B到C发出的值。我有两个问题: 我在Bolt B中设置TOPOLOGY\u TICK\u TUPLE\u FREQ\u SECS,并在创建Bolt B时新建Object D。当TupleHelpers.isTickTuple(输入)为true时,它向螺栓C发射对象D。我认为风暴将克隆对象D并在螺栓C中生成一个新的,但是,当我尝试更新对象D的内容时,它仍然在螺栓B中更改。为什么?这两个螺栓可

我有一个拓扑,并在本地模式下运行它,比如
喷口a
-->
螺栓B
-->
螺栓C
。此外,我定义了一个对象
对象D
,它是从B到C发出的值。我有两个问题:

  • 我在
    Bolt B
    中设置
    TOPOLOGY\u TICK\u TUPLE\u FREQ\u SECS
    ,并在创建
    Bolt B
    时新建
    Object D
    。当
    TupleHelpers.isTickTuple(输入)
    true
    时,它向
    螺栓C发射
    对象D
    。我认为风暴将克隆
    对象D
    并在
    螺栓C
    中生成一个新的,但是,当我尝试更新
    对象D
    的内容时,它仍然在
    螺栓B
    中更改。为什么?这两个螺栓可能位于不同的服务器中,并且不可能在多个螺栓之间共享内存中的相同变量
  • 螺栓B 螺栓C
  • 当我在
    螺栓B
    螺栓C
    中设置
    拓扑结构\u勾选\u元组\u频率\u秒
    时,风暴是如何工作的。由于
    螺栓C
    螺栓B
    之后,在多个螺栓中设置
    拓扑结构\u勾选\u元组\u频率\u秒
    是否毫无意义

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


    对于第二个问题,拓扑结构\u TICK\u TUPLE\u FREQ\u SECS配置用于向螺栓发送额外的TICK元组,高于通过上游螺栓发送到螺栓的任何其他元组。这意味着您可以向任意数量的组件发送tick tuple,只要它对拓扑设计有意义。

    tick tuple是风暴以配置的频率时间间隔自动生成的附加tuple。如果您希望在收到勾号元组时将对象D从螺栓B发射到螺栓C,则无需在螺栓C中配置勾号元组。在您的示例中,您已设置:

    TOPOLOGY_TICK_TUPLE_FREQ_SECS=10
    

    在螺栓B中。因此螺栓B将每10秒收到一个勾号元组,在这段时间内,您可以在螺栓B中创建对象D并将对象发送给螺栓C,螺栓C将完成任务并确认元组。

    非常感谢!这使我更清楚地了解了emit函数。但我对问题2还有一些问题。如果我在
    bolt B
    bolt C
    中设置
    TOPOLOGY\u TICK\u TUPLE\u FREQ\u SECS=10
    ,我发现当
    bolt B
    在10秒后发出对象时,
    bolt C
    将执行
    tuplehalpers.isTickTuple(输入)==false
    部分,然后立即执行相等的true部分。这有意义吗?我还从日志中观察到一件事。如果我在
    bolt B
    中设置
    TOPOLOGY\u TICK\u TUPLE\u FREQ\u SECS=10
    ,在
    bolt C
    中设置
    TOPOLOGY\u TICK\u FREQ\u SECS=3
    。storm将使用最小值作为tick tuple的时间戳。
    @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());
    }
    
    TOPOLOGY_TICK_TUPLE_FREQ_SECS=10