我对ApacheStorm的性能有一个问题,主要是从喷口。
我有一个从红隼队列中发射物品的拓扑。我买了大约2000件,每次 nextTuple
在我发出的喷口中被称为。
当我在i7macbookpro的本地集群中运行时,我看到我每秒发出大约20个元组,风暴将调用 nextTuple
每50ms一次。
我使用1个喷口任务和1个喷口执行器运行。我有 setMaxSpoutPending
设置为10。
为什么每次打电话都有这么大的时间间隔 nextTuple
? outputcollector是否在发出新元组之前等待每个元组的回音?
我正在运行Java8和StormVersion0.9.4
2条答案
按热度按时间brgchamk1#
你的模式很不对劲。。。您应该只从队列中获取一个元组,或者发出所有获取的2000个元组。这将遵循storm的设计。
使用额外的线程并不符合storm的设计。你没有理由不想同时发出2000个元组。。。
是的,如果你在你的喷口中分配消息ID并设置
max.spout.pending
风暴不会再打电话给我了Spout.nextTuple()
只要有超过10个元组在飞行中,即没有确认。nqwrtyyt2#
根据文件:https://storm.apache.org/apidocs/backtype/storm/spout/ispout.html
storm在同一个线程上执行ack、fail和nexttuple。这意味着ispout的实现者不需要担心这些方法之间的并发问题。但是,这也意味着实现者必须确保nexttuple是非阻塞的:否则该方法可能会阻塞待处理的ack和fails。
技巧1:调用nexttuple时发出1个tuple。技巧2:不要在nexttuple中获取数据,而是在单独的线程中执行,并使用任何并发队列来推送和轮询数据,这样nexttuple将只轮询数据。技巧3:尝试将setmaxspoutpending设置为1。技巧4:确保每个bolt的execute(tuple)方法都得到了优化。