我对Apache Storm的性能有疑问,主要是喷口造成的。

我有一个从红est队列中发射项目的拓扑。我获取约2000个项目,并且每次在喷口中调用nextTuple时都会发出一个。

在i7 Macbook Pro上的本地群集中运行时,我看到每秒发出约20个元组,并且该风暴每50毫秒调用一次nextTuple

我正在使用1个喷口任务和1个喷口执行器运行。我将setMaxSpoutPending设置为10。

为什么每次调用nextTuple之间的时间间隔都这么大? outputCollector是否在发出新的元组之前等待每个元组的回音?

我正在运行Java 8和Storm版本0.9.4

最佳答案

来自文档:https://storm.apache.org/apidocs/backtype/storm/spout/ISpout.html

Storm在同一线程上执行ack,fail和nextTuple。这意味着ISpout的实现者无需担心这些方法之间的并发问题。但是,这也意味着实现者必须确保nextTuple处于非阻塞状态:否则,该方法可能会阻塞待处理的acks和失败。

提示1:在调用nextTuple时发出1个元组。
提示2:不要在nextTuple中获取数据,请在单独的线程中进行处理,并使用任何并发队列来推送和轮询数据,以便nextTuple仅进行轮询。
提示3:尝试将setMaxSpoutPending设置为1。
技巧4:确保优化每个螺栓的execute(tuple)方法。

09-25 22:01