Why use Storm? Apache Storm是一個免費的開源的分散式實時計算系統。Storm使得可靠的實時處理無邊界的數據量變得很容易,就如同Hadoop做批處理那樣。Storm很簡單,可以用任意的編程語言。 Storm有許多使用案例:實時分析、線上機器學習、持續的計算、分散式RPC、ET ...
Why use Storm?
Apache Storm是一個免費的開源的分散式實時計算系統。Storm使得可靠的實時處理無邊界的數據量變得很容易,就如同Hadoop做批處理那樣。Storm很簡單,可以用任意的編程語言。
Storm有許多使用案例:實時分析、線上機器學習、持續的計算、分散式RPC、ETL等等。Storm很快速:每個節點每秒鐘可以處理一百萬個元組。它是可伸縮的、容錯的,保證你的數據將會被處理,並且很容易操作。
Storm集成了隊列和資料庫技術。一個Storm拓撲結構以任意複雜的方式消費並處理數據流,在計算的每一個階段會重新分區數據流。
Concepts
Topologies
一個實時應用程式的邏輯被打包成一個Storm topology。Storm topology和MapReduce的Job很類似。一個最關鍵的不同在於,一個MapReduce的Job最終會結束,而一個topology是永遠運行的(除非你手動殺死它)。一個topology是一個由spouts和bolts以及將它們連接起來的stream grouping構成的圖。
Streams
Stream是Storm中的核心抽象。一個Stream是一個無邊界的元組序列。Stream是由元組中的命名欄位被定義的。預設情況下,元組可以包含integers, longs, shorts, bytes, strings, doubles, floats, booleans, and byte arrays。你也可以定義自己的序列化方式。
每一個Stream在被聲明的時候都會給定一個id。
Spouts
在一個topology中,spouts是流的來源。一般而言,spout從外部的源中讀取元組,並將其發送到topology中。Spout可以是可靠的,也可以是不可靠的。一個可靠的spout是如果在Storm中處理失敗的話它會重新放一個元組,而不可靠的spout在它發送這個元組以後就忘記它了。
Spouts可以發送到一個或者多個Stream。為了這樣做,在聲明多個stream的時候OutputFieldsDeclarer的declareStream方法。
Spout中的主要方法是nextTuple。nextTuple發送一個新的元組到topology中或者沒有新的元組的時候簡單的返回。另一個重要的方法是ack和fail。
Bolts
Topologies中的所有處理都是由Bolts來做的。Bolts可以做許多事情,比如:過濾、聚集、連接數據等等。
Bolts可以做簡單的流轉換,複雜的流轉換通常需要多步,因此也需要多個bolts。
當你聲明瞭一個bolt的輸入流的時候,你總是會訂閱來自其它組件的特別的流。如果你想訂閱所有組件的流,那麼你必須一個一個的訂閱。
bolt的主要方法是execute
Stream groupings
一個stream grouping是定義流應該怎樣被分區到bolt的task中去。
- Shuffle grouping:元組被隨機分配到task中去,因此每個bolt可以保證獲得相等數量的元組
- Fields grouping:按特定的欄位分區。例如,"user-id"相同的元組總是被分到相同的task中去
- Partial Key grouping:跟Fields grouping類似,只不過會考慮下游的bolts的負載均衡
- All grouping:流會被覆制,並且分發給所有的bolt
- Global grouping:整個流只進入到一個bolt的task。特別的,將進入到id最小的那個task
- None grouping:你不關心怎麼分組。等價於Shuffle grouping
- Direct grouping:元組的生產者決定哪些消費者任務可以收到這個元組
- Local or shuffle grouping:如果目標bolts在相同的worker中有一個或者多個task,元組將會被隨機分配到這些任務中
Reliability
Storm保證每個spout元組被完全處理。這是通過跟蹤由每個元組觸發的元組樹實現的
Tasks
每一個spout和bolt都執行很多tasks,每一個task對應執行的一個線程,stream grouping定義元組怎麼從一個task到另一個task。
Workers
Topologies執行一個或多個worker進程。每個worker進程是一個物理的JVM。
參考 http://storm.apache.org/index.html