2014-03-26 38 views
3

默認情況下,當出口或螺栓出現異常時,它會重新啓動出料口或螺栓並再次嘗試。是否有任何配置選項使其停止拓撲,也許在N次重複嘗試之後? (例如,Hadoop在放棄之前嘗試4次。)如何讓Storm暫停例外?

我有一個Storm拓撲運行77天,一個螺栓在每個元組上引發異常。在這樣的情況下,我寧願它失敗,以便我注意到有什麼不對。

+0

這聽起來有點奇怪,因爲如果發生異常,除非我們將它們封裝在FailedException中(在這種情況下它將重試),否則我們的拓撲會停止。 – bridiver

+0

我沒有明確地將它們包裝在我的螺栓代碼中,但它聽起來像是我們的兩個Storm安裝之間有一些系統範圍的設置。我的系統管理員不知道這個問題,但我希望SO上有人能做到。 –

+0

您不想停止拓撲,拓撲就是要實時處理事件。如果一個元組產生了一個致命的錯誤,它應該被丟棄並且可能記錄在某個地方,但是不應該阻塞拓撲來處理剩餘的元組。 – Svend

回答

2

沒有停止拓撲(當前)的選項。說實話,殺死整個拓撲只是因爲一個例外是強力恕我直言。

在您的方案中,這些異常應該在應用程序層中處理。

是否有任何配置選項使其停止拓撲,也許在N次重複嘗試後?

有沒有現成的解決方案,但你可以做到這一點,並跟蹤噴口重試的元組。如果滿足閾值,則記錄元組或將其發送到消息隊列。

我有一個風暴拓撲運行77天,一個螺栓引發每個元組的異常。

那麼也許你的螺栓代碼中有一個錯誤?

一種策略是將失敗的元組發送到按摩隊列或事件總線(例如HornetQ,Apache Kafka,Redis)並擁有一個監聽器,以便您立即通知有毒元組。

+1

是的,我的螺栓代碼中有一個錯誤;這就是我想要了解的內容。是否真的有必要爲每個想要運行的小分析設置一個消息隊列?你讓它聽起來像是一個大製作---沒有人會和Storm一起做一次快速的一次性?在臨時工作中,如果失敗了,它應該會死亡,明顯地。 –

+0

@JimPivarski調用System.exit()可以在這種情況下幫助你假設你沒有在監督下運行Storm(自動重啓)。 – Chiron

0

據我所見,Storm不會重試一個元組(它本身會導致異常)。它會默認,只是繼續處理下一個元組。相同的元組不會重新嘗試,除非Spout實現了失敗方法。