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
中设置拓扑结构\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