Storm入門之第一章
譯者注:本文翻譯自《Getting Started With Storm》,本書中所有Storm相關術語都用斜體英文表示。 這些術語的字面意義翻譯如下,由於這個工具的名字叫Storm,這些術語一律按照氣象名詞解釋
- spout 龍捲,讀取原始資料為bolt提供資料
- bolt 雷電,從spout或其它bolt接收資料,並處理資料,處理結果可作為其它bolt的資料來源或最終結果
- nimbus 雨雲,主節點的守護程序,負責為工作節點分發任務。
下面的術語跟氣象就沒有關係了
- topology 拓撲結構,Storm的一個任務單元
- define field(s)
本文是該書的第一章。
基礎知識
Storm是一個分散式的,可靠的,容錯的資料流處理系統。它會把工作任務委託給不同型別的元件,每個元件負責處理一項簡單特定的任務。Storm叢集的輸入流由一個被稱作spout的元件管理,spout把資料傳遞給bolt, bolt要麼把資料儲存到某種儲存器,要麼把資料傳遞給其它的bolt。你可以想象一下,一個Storm叢集就是在一連串的bolt之間轉換spout傳過來的資料。
這裡用一個簡單的例子來說明這個概念。昨晚我在新聞節目裡看到主持人在談論政治人物和他們對於各種政治話題的立場。他們一直重複著不同的名字,而我開始考慮這些名字是否被提到了相同的次數,以及不同次數之間的偏差。
想像播音員讀的字幕作為你的資料輸入流。你可以用一個spout讀取一個檔案(或者socket,通過HTTP,或者別的方法)。文字行被spout傳給一個bolt,再被bolt按單詞切割。單詞流又被傳給另一個bolt,在這裡每個單詞與一張政治人名列表比較。每遇到一個匹配的名字,第二個bolt為這個名字在資料庫的計數加1。你可以隨時查詢資料庫檢視結果, 而且這些計數是隨著資料到達實時更新的。所有元件(spouts和bolts)及它們之間的關係請參考拓撲圖1-1
現在想象一下,很容易在整個Storm叢集定義每個bolt 和spout的並行性級別,因此你可以無限的擴充套件你的拓撲結構。很神奇,是嗎?儘管這是個簡單例子,你也可以看到Storm的強大。
有哪些典型的Storm應用案例?
資料處理流
正如上例所展示的,不像其它的流處理系統,Storm不需要中間佇列。
連續計算
連續傳送資料到客戶端,使它們能夠實時更新並顯示結果,如網站指標。
分散式遠端過程呼叫
頻繁的CPU密集型操作並行化。
Storm元件
對於一個Storm叢集,一個連續執行的主節點組織若干節點工作。
在Storm叢集中,有兩類節點:主節點master node和工作節點worker nodes。主節點執行著一個叫做Nimbus的守護程序。這個守護程序負責在叢集中分發程式碼,為工作節點分配任務,並監控故障。Supervisor守護程序作為拓撲的一部分執行在工作節點上。一個Storm拓撲結構在不同的機器上執行著眾多的工作節點。
因為Storm在Zookeeper或本地磁碟上維持所有的叢集狀態,守護程序可以是無狀態的而且失效或重啟時不會影響整個系統的健康(見圖1-2)
在系統底層,Storm使用了zeromq(0mq, zeromq(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.你可以為幾乎任何計算得到恰好一次訊息語義。