2017-06-08 64 views
0

最近我遇到了一個非常奇怪的問題。風暴集羣有3臺機器。拓撲結構就像這樣,Kafka Spout A - > Bolt B - > Bolt C.我已經在每個螺栓中搜索了所有元組,儘管可能會拋出異常內部螺栓(在螺栓執行方法中,我嘗試捕獲所有異常,最後ack元組)。 但是這裏發生了奇怪的事情。我在一臺機器上打印噴口的日誌,在噴口上查找所有元組,但在其他兩臺機器上,幾乎所有的元組都失敗了。 60秒後,元組重複播放一遍又一遍。 「幾乎」意味着在開始時,所有元組在另外兩臺機器上都失敗了。過了一段時間,這兩臺機器上出現少量元組。風暴消息失敗

絕對的元組由於超時而失敗。但我真的不知道他們爲什麼超時。根據我打印的日誌,我確定所有的元組都在每個螺栓的執行方法結束時被acked。所以我想知道爲什麼一些元組在2臺機器上失敗了。

我能做些什麼來找出拓撲結構或風暴集羣有什麼問題嗎?真的非常感謝,希望得到您的回覆。

回答

0

您的問題與在StormTopology中由KafkaSpout處理背壓有關。

您可以在拓撲配置設置maxSpoutPending值處理KafkaSpout的背壓,

Config config = new Config(); 
config.setMaxSpoutPending(200); 
config.setMessageTimeoutSecs(100); 

StormSubmitter.submitTopology("testtopology", config, builder.createTopology()); 

maxSpoutPending是元組,可以在給定的時間是在拓撲未決確認的數量。設置這個屬性將會使KafkaSpout不會從Kafka中消耗更多的數據,除非未確認的元組數小於maxSpoutPending值。

此外,請確保您可以微調您的螺栓儘可能輕量級,以便元組超時前確認。