最近我遇到了一个非常奇怪的问题。风暴群有3台机器。拓扑结构是这样的,Kafka Spout A - >螺栓B - > Bolt C.我已经在每个螺栓中取消了所有元组,即使可能会抛出异常内部螺栓(在螺栓执行方法中我尝试捕获所有异常,最后确认元组)。 但是这里发生了奇怪的事情。我打印出喷口的日志,在一台机器上喷出了所有元组,但在其他两台机器上,几乎所有的元组都失败了。 60秒后,元组一次又一次地重放。 '几乎'意味着在开始时,所有元组在其他2台机器上都失败了。过了一会儿,两台机器上就会发现少量的元组。
由于超时,元组完全失败。但我真的不知道他们为什么会超时。根据我打印过的日志,我确定所有元组在每个螺栓的执行方法结束时都会被激活。所以我想知道为什么有些元组在两台机器上失败了。
我有什么办法可以找出拓扑或风暴群集有什么问题吗?非常感谢并希望得到你的回复。
答案 0 :(得分:0)
你的问题与KafkaSpout在StormTopology中对背压的处理有关。
您可以通过在拓扑配置中设置maxSpoutPending值来处理KafkaSpout的背压,
Config config = new Config();
config.setMaxSpoutPending(200);
config.setMessageTimeoutSecs(100);
StormSubmitter.submitTopology("testtopology", config, builder.createTopology());
maxSpoutPending是在给定时间拓扑中可以挂起确认的元组数。设置此属性,将使KafkaSpout不再使用来自Kafka的更多数据,除非未确认的元组计数小于maxSpoutPending值。
另外,请确保您可以将Bolts微调为尽可能轻量级,以便在超时之前确认元组。