?
不多說,直接上干貨!
?
?
storm的特性
Storm 是一個開源的分布式實時計算系統,可以簡單、可靠地處理大量的數據流。 Storm支持水平擴展,具有高容錯性,保證每個消息都會得到處理,而且處理速度很快(在一個小集群中,每個節點每秒可以處理數以百萬計的消息)。 Storm 的部署和運維都很便捷,而且更為重要的是,可以使用任意編程語言來開發應用。
?
?
?
下面介紹 Storm 的特點
(1)編程模型簡單
在大數據處理方面, Hadoop 為開發者提供了 MapReduce 原語,使并行批處理程序變得非常簡單和優美。同樣, Storm 也為大數據的實時計算提供了一些簡單優美的原語,這大大降低了開發并行實時處理任務的復雜性,可以快速、高效地開發應用。
(2)可擴展
在 Storm 集群中真正運行 Topology 的主要有 3 個實體:工作進程、線程和任務。 Storm集群中的每臺機器都可以運行多個工作進程,每個工作進程又可創建多個線程,每個線程可以執行多個任務,任務是真正進行數據處理的實體,開發的 Spout、 Bolt 就是作為一個或者多個任務的方式執行的。因此,計算任務在多個線程、進程和服務器之間并行進行,支持靈活的水平擴展。
(3)高可靠性
Storm 可以保證 Spout 發出的每條消息都能被“完全處理”,這也是直接區別于其他實時系統的地方,如 S4。
?
?
注意:
Spout 發出的消息后續可能會觸發產生成千上萬條消息,可以形象地理解為一棵消息樹,其中 Spout 發出的消息為樹根, Storm 會跟蹤這棵消息樹的處理情況,只有當這棵消息樹中的所有消息都被處理了,Storm 才會認為 Spout 發出的這個消息已經被“完全處理”。如果這棵消息樹中的任何一個消息處理失敗了,或者整棵消息樹在限定的時間內沒有“完全處理”,那么 Spout 發出的消息就會重發。
考慮到盡可能減少內存的消耗, Storm 并不會跟蹤消息樹中的每個消息,而是采用了一些特殊的策略,它把消息樹當作一個整體來跟蹤,對消息樹中所有消息的唯一 ID 進行異或計算,通過是否為 0 來判定 Spout 發出的消息是否被“完全處理”,這極大地節約了內存并簡化了判定邏輯,后面會詳細介紹這種機制。
在這種模式下,每發送一個消息,都會同步發送一個 ack/fail,對于網絡的帶寬會有一定的消耗,如果對可靠性要求不高,則可使用不同的 emit 接口關閉該模式。
上面所說的, Storm 保證了每個消息至少被處理一次,但是對于有些計算場合,會嚴格要求每個消息只被處理一次, Storm 的 0.7.0 引入了事務性拓撲,解決了這個問題,后面章節會詳述。
?
(4)高容錯性
如果在消息處理過程中出了一些異常, Storm 會重新安排這個出問題的處理單元。 Storm保證一個處理單元永遠運行(除非顯式殺掉該處理單元)。當然,如果處理單元中存儲了中間狀態,那么當處理單元重新被 Storm 啟動時,需要將自身處理的中間狀態恢復。
?
(5)支持多種編程語言
除了用 Java 實現 Spout 和 Bolt,還可以使用其他編程語言來完成這項工作,這一切得益于 Storm 的多語言協議。多語言協議是 Storm 內部的一種特殊協議,允許 Spout 或 Bolt 使用標準輸入和標準輸出來傳遞消息,傳遞的消息為單行文本或多行 JSON 編碼的格式。
Storm 支持多語言編程主要是通過 ShellBolt、 ShellSpout 和 ShellProcess 這些類來實現的,這些類都實現了 IBolt 和 ISpout 接口,以及讓 Shell 通過 Java 的 ProcessBuilder 類來執行腳本或者程序的協議。
可以看到,采用這種方式,每個 Tuple 在處理時都需要進行 JSON 的編解碼,因此在吞吐量上會有較大影響。
(6)支持本地模式
Storm 有一種“本地模式”,也就是在進程中模擬一個 Storm 集群的所有功能,以本地模式運行 Topology 與在集群上運行 Topology 類似,這對于開發和測試來說非常有用。
(7)高效
用 ZeroMQ 作為底層消息隊列,保證消息能被快速處理。
?