我对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)方法。