我遇到了Apache Storm的奇怪问题。我有一个KafkaSpout连接到Kafka集群,里面有10条消息。
Bolts接收每条消息并正确处理它们,因为在Storm UI中它们被列为'acked'。但是,风暴用户界面下列出的Spout表示所有元组都失败了。
我相信这会导致喷口再次重新发出所有消息......所以我看到一个Storm Bolt打印出消息1-10然后一遍又一遍地以相同的顺序打印出来。< / p>
我正在适当地调用.ack()
和.fail()
方法,我只是不知道为什么Spout会将它们列为失败。
有什么想法吗?
答案 0 :(得分:3)
事实证明,当他们完成处理元组时,下游的几个螺栓没有执行任务。这导致spout元组失败并最终再次发送元组,导致连续循环。
答案 1 :(得分:2)
当喷口读取消息并将其传递给螺栓时,消息应完成TOPOLOGY_MESSAGE_TIMEOUT_SECS / "topology.message.timeout.secs"
所有相关的螺栓必须确认,然后acker向喷口指示消息已被处理(如果是kafka喷口,喷口将增加偏移量。)
如果您在日志SPOUT Failing
中看到,可能是:
topology.message.timeout.secs
内完成处理消息,因此未按时发送确认。 #3示例:如果您有5个螺栓,由于数据库连接问题,每个螺栓大约需要10秒,因此在#3螺栓之后,您将通过默认的30秒风暴超时,并且无法处理该消息。然后,喷口将再次重播此消息。
因此,要么提高超时配置,要么更快失败(例如:更短的数据库连接超时),或者有时降低TOPOLOGY_MAX_SPOUT_PENDING
也可以帮助以防大量消息等待处理,以及之前的消息需要很长时间。