1. 程式人生 > >【Streaming】我在拓撲中使用了Ack機制,為什麼在Storm UI上有大量Failed資料?

【Streaming】我在拓撲中使用了Ack機制,為什麼在Storm UI上有大量Failed資料?

提問:

1. 在Storm UI上,有大量Failed資料,且往往是一旦開始有Fail資料,則Fail資料越積越多
2. 整體事件端到端延遲很大

分析:

當spout接收到大量資料,而後端bolt處理較慢,如果spout傳送的事件在超時時間(topology.message.timeout.secs 預設為30s)內沒有最終ACK閉環,即在超時時間內最初的原始訊息沒有最終獲得處理完成的ACK響應時,該事件成為Fail事件。當輸入資料量大,且後端處理較為耗時,而無法在設定時間內處理完且ACK時,則會造成超時FAIL。

解決方案:

1、 加大topology.message.timeout.secs預設超時時間,如60s
2、 觀察系統ACK執行緒處理效能,如UI介面中的:
如果該處理效能較低可考慮增加ACK執行緒數:topology.acker.executors(預設為null,即與該任務的work數一致),可設定為worker的倍數
3、 減少topology.max.spout.pending(預設為null,即不做限制),該配置項可以對spout task接收速度進行流控,例如可以從設定topology.max.spout.pending = 1024開始,即表示當spout傳送的資料已經將該pending佇列佔滿,則在該佇列滿未有空間時,spout的nextTuple方法不被呼叫,即進行了流控

可能的影響:

topology.max.spout.pending設定後,會降低整個系統的吞吐量,可以先從1024開始,不斷增加,最終達到系統穩定且吞吐量合適。