> 譯者注:本文翻譯自《[Getting Started With Storm](http://ifeve.com/wp-content/uploads/2014/03/Getting-Started-With-Storm-Jonathan-Leibiusky-Gabriel-E_1276.pdf)》,本書中所有Storm相關術語都用斜體英文表示。
這些術語的字面意義翻譯如下,由于這個工具的名字叫Storm,這些術語一律按照氣象名詞解釋
* *spout*?龍卷,讀取原始數據為*bolt*提供數據
* *bolt*?雷電,從*spout*或其它*bolt*接收數據,并處理數據,處理結果可作為其它*bolt*的數據源或最終結果
* *nimbus*?雨云,主節點的守護進程,負責為工作節點分發任務。
下面的術語跟氣象就沒有關系了
* *topology*?拓撲結構,Storm的一個任務單元
* *define field(s)*?定義域,由*spout*或*bolt*提供,被*bolt*接收
本文是該書的第一章。
## 基礎知識
Storm是一個分布式的,可靠的,容錯的數據流處理系統。它會把工作任務委托給不同類型的組件,每個組件負責處理一項簡單特定的任務。Storm集群的輸入流由一個被稱作*spout*的組件管理,*spout*把數據傳遞給*bolt*,?*bolt*要么把數據保存到某種存儲器,要么把數據傳遞給其它的*bolt*。你可以想象一下,一個Storm集群就是在一連串的*bolt*之間轉換*spout傳*過來的數據。
這里用一個簡單的例子來說明這個概念。昨晚我在新聞節目里看到主持人在談論政治人物和他們對于各種政治話題的立場。他們一直重復著不同的名字,而我開始考慮這些名字是否被提到了相同的次數,以及不同次數之間的偏差。
想像播音員讀的字幕作為你的數據輸入流。你可以用一個*spout*讀取一個文件(或者socket,通過HTTP,或者別的方法)。文本行被*spout*傳給一個*bolt*,再被bolt按單詞切割。單詞流又被傳給另一個*bolt*,在這里每個單詞與一張政治人名列表比較。每遇到一個匹配的名字,第二個*bolt*為這個名字在數據庫的計數加1。你可以隨時查詢數據庫查看結果, 而且這些計數是隨著數據到達實時更新的。所有組件(*spouts*和*bolts*)及它們之間的關系請參考拓撲圖1-1
[](http://ifeve.com/storm%e5%85%a5%e9%97%a8%e7%bf%bb%e8%af%91getting-started-with-storm/figure-1-1-a-simple-topology/)
現在想象一下,很容易在整個Storm集群定義每個*bolt*?和*spout*的并行性級別,因此你可以無限的擴展你的拓撲結構。很神奇,是嗎?盡管這是個簡單例子,你也可以看到Storm的強大。
有哪些典型的Storm應用案例?
數據處理流
正如上例所展示的,不像其它的流處理系統,Storm不需要中間隊列。
連續計算
連續發送數據到客戶端,使它們能夠實時更新并顯示結果,如網站指標。
分布式遠程過程調用
頻繁的CPU密集型操作并行化。
## Storm組件
對于一個Storm集群,一個連續運行的主節點組織若干節點工作。
在Storm集群中,有兩類節點:主節點*master node*和工作節點*worker nodes*。主節點運行著一個叫做*Nimbus*的守護進程。這個守護進程負責在集群中分發代碼,為工作節點分配任務,并監控故障。Supervisor守護進程作為拓撲的一部分運行在工作節點上。一個Storm拓撲結構在不同的機器上運行著眾多的工作節點。
因為Storm在Zookeeper或本地磁盤上維持所有的集群狀態,守護進程可以是無狀態的而且失效或重啟時不會影響整個系統的健康(見圖1-2)
[](http://ifeve.com/storm%e5%85%a5%e9%97%a8%e7%bf%bb%e8%af%91getting-started-with-storm/figure-1-2-components-of-a-storm-cluster/)
在系統底層,Storm使用了zeromq(0mq, zeromq([http://www.zeromq.org](http://www.zeromq.org/)))。這是一種先進的,可嵌入的網絡通訊庫,它提供的絕妙功能使Storm成為可能。下面列出一些zeromq的特性。
* 一個并發架構的Socket庫
* 對于集群產品和超級計算,比TCP要快
* 可通過inproc(進程內), IPC(進程間), TCP和multicast(多播協議)通信
* 異步I / O的可擴展的多核消息傳遞應用程序
* 利用扇出(fanout), 發布訂閱(PUB-SUB),管道(pipeline), 請求應答(REQ-REP),等方式實現N-N連接
**NOTE**: Storm只用了push/pull sockets
## Storm的特性
在所有這些設計思想與決策中,有一些非常棒的特性成就了獨一無二的Storm。
* 簡化編程 ? ?如果你曾試著從零開始實現實時處理,你應該明白這是一件多么痛苦的事情。使用Storm,復雜性被大大降低了。
* 使用一門基于JVM的語言開發會更容易,但是你可以借助一個小的中間件,在Storm上使用任何語言開發。有現成的中間件可供選擇,當然也可以自己開發中間件。
* 容錯 ? ? ? ? Storm集群會關注工作節點狀態,如果宕機了必要的時候會重新分配任務。
* 可擴展 ? ?所有你需要為擴展集群所做的工作就是增加機器。Storm會在新機器就緒時向它們分配任務。
* 可靠的 ? ?所有消息都可保證至少處理一次。如果出錯了,消息可能處理不只一次,不過你永遠不會丟失消息。
* 快速 ? ? ? ?速度是驅動Storm設計的一個關鍵因素
* 事務性 ? You can get exactly once messaging semantics for pretty much any computation.你可以為幾乎任何計算得到恰好一次消息語義。