Storm Spout /拓扑性能

时间:2016-03-09 15:25:22

标签: java apache-storm

我遇到Apache Storm性能问题,主要来自spout。

我有一个从kestrel队列发出项目的拓扑。我取了大约2000个项目,每次在喷口中调用nextTuple时我会发出一个。

当我在i7 Macbook Pro上的本地群集中运行时,我发现每秒发出大约20个元组,并且该风暴将每50分钟调用nextTuple一次。

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

为什么每次拨打nextTuple之间的间隔时间间隔都很大?在发出新元组之前,outputCollector是否等待从每个元组回听?

我正在运行java 8和风暴版本0.9.4

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

你的模式非常糟糕......你应该从队列中只获取一个元组,或者发出你提取的所有2000个元组。这将遵循Storm的设计。

使用额外的线程与Storm的设计不一致。并且你没有理由不想一次发出所有2000个元组......

是的,如果你在Spout中分配了消息ID并设置了max.spout.pending只要超过10个元组在飞行中,那么Storm就不会对Spout.nextTuple()进行下一次调用,即不会被激活