Storm入門指南第一章 基礎知識

五柳-先生發表於2015-11-18

Storm是一個分散式、可靠、容錯的流式資料處理系統。處理工作被分派給不同型別的元件(components),每個元件分別負責一個簡單、特定的處理任務。處理Storm叢集輸入流的元件叫噴口(spout),噴口再將資料傳給一個叫螺栓(bolt)的元件,並在螺栓中處理資料,處理完成之後,螺栓要麼將這些資料儲存起來(儲存在資料庫、磁碟甚至是物件中),要麼將它傳給其他螺栓。因此,可以將Storm叢集想象成一個螺栓鏈,每個螺栓都會對噴口傳送的資料作出一些處理。

譯者的話:後面對spout、bolt都採用英文叫法,不再使用噴口、螺栓~~

這裡使用一個簡單的例子去解釋這個概念:昨晚我在看新聞時,幾個播音員開始談論政客和他們的地位,他們不停地重複不同的名字,我很好奇每個名字被提及的次數是否相同,還是有些偏差。

這裡,將播音員們說的字幕想象成你的輸入資料流,讓spout來從一個檔案(或者套接字[socket])讀取這個輸入。當成行的文字到達時,spout將它們交給一個bolt,該bolt將文字分離成一個個的單詞。接著,這個單詞流被傳遞到另一個bolt,這個bolt會將每個單詞與一個預先定義好的政客名字列表作比較。對於每一次匹配成功(單詞與政客名字相同),第二個bolt會在資料庫中增加一次那個名字的計數。當你想看結果的時候,只需要查詢資料庫,該資料庫在資料到達的時候會被實時更新。所有元件(spouts和bolts)的排列、連線被稱為一個拓撲(topology),如圖1-1.

topology圖1-1 一個簡單的拓撲

 設想簡單地定義整個叢集中每個bolt和spout的並行度,這樣你就可以無限地擴充套件你的拓撲。很神奇,對吧?儘管這只是一個簡單的例子,但是你可以看到Storm有多強大。

Storm的典型用例有哪些呢?

流處理:正如前面的例子中所展示的,和其他流處理系統不同的是,使用Storm不需要中間佇列。

連續計算:向客戶端持續傳送資料,以便它們能實時更新、顯示結果,例如網站統計。

分散式遠端過程呼叫:可簡單地並行執行CPU密集型操作。

Storm叢集組成部分

在Storm叢集中,所有節點被一個連續執行的主節點管理。

在Storm叢集中有兩種節點:主節點(master node)和工作節點(worker nodes)。主節點上執行了一個叫Nimbus的後臺程式,它負責在叢集內分發程式碼、為每個工作節點指派任務、監控失敗的任務。工作節點上執行了一個叫Supervisor的後臺程式,它執行topology的一部分。Storm中的一個topology執行在很多工作節點上,這些工作節點分佈在不同的機器。

由於Storm將所有叢集狀態儲存在Zookeeper或者本地磁碟上,因此這些後臺程式是無狀態的,並且可以在不影響系統健康的情況下失效或者重啟(見圖1-2)。

Storm叢集組成部分圖1-2.Storm叢集的組成部分

Storm在底層使用zeromq(0mq,zeromq),它是一個高階、可嵌入、提供極好特性的網路庫,這使得Storm成為可能。下面列舉了一些zeromq的特點:

  • 充當併發框架的套接字型檔(socket lib)
  • 對於叢集產品和超級計算,比TCP更快速
  • 在程式內、IPC、TCP和多播之間傳遞資料
  • 非同步IO支援可擴充套件的多核訊息傳遞應用
  • 通過展開、釋出訂閱、管道、請求應答連線N-to-N

提示:Storm只使用push/pull套接字。

譯者的話:不必糾結於此處關於zeromq的解釋,容易犯暈,需要的時候再看。

Storm特性

程式設計簡單:如果你嘗試過從頭開始構建實時處理系統,你就會明白它有多痛苦。使用storm,複雜性被大大減少。

支援多種程式語言:使用基於JVM的語言開發變得更簡單了,然而storm支援任何語言,只要你使用或者實現一個小的中間庫。

容錯:Storm關注workers節點的當機,並在必要時刻對任務進行重分配。

可擴充套件:為了擴充套件叢集,你所需做的只是向叢集中增加更多的機器,當它們可用的時候Storm會為新機器分配任務。

可靠:所有的訊息都確保至少處理一次。如果有錯誤,訊息可能會被處理不止一次,但是你永遠不會丟失資料。

快速:速度曾是驅動Storm設計的關鍵因素。

事務性:對於幾乎任何計算,你可以確切地獲取一次訊息語義。

相關文章