我遇到Apache Storm性能问题,主要来自spout。
我有一个从kestrel队列发出项目的拓扑。我取了大约2000个项目,每次在喷口中调用nextTuple
时我会发出一个。
当我在i7 Macbook Pro上的本地群集中运行时,我发现每秒发出大约20个元组,并且该风暴将每50分钟调用nextTuple
一次。
我正在使用1个喷口任务和1个喷口执行器运行。我将setMaxSpoutPending
设置为10。
为什么每次拨打nextTuple
之间的间隔时间间隔都很大?在发出新元组之前,outputCollector是否等待从每个元组回听?
我正在运行java 8和风暴版本0.9.4
答案 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()
进行下一次调用,即不会被激活