Storm應用場景詳解

Storm是一個分佈式的、可靠的、容錯的數據流處理系統(流式計算框架,可以和mapreduce的離線計算框架對比理解)。整個任務被委派給不同的組件,每個組件負責一個簡單的特定的處理任務。Storm集羣的輸入流是一個叫spout的組件負責接入處理。spout把數據傳給bolt組件,bolt組件可以對數據完成某種轉化。bolt組件可以把數據持久化,或者傳送到其他的bolt。可以把Storm集羣想象成一個bolt組件鏈,每個組件負責對spout流入的數據(也可以是其他bolt流入的數據)進行某種形式的處理。

有個簡單的例子可以說明這個概念。昨晚我看新聞,節目中發言人在談論政治家以及他們在不用領域的立場。他們不停地在重複一些不同的名字,這時我想知道他們提到的每個名字出現的次數是否一樣,還是在某些名字被提及次數更多。

把發言人的言語想象成數據的輸入流。我們可以定義一個spout從文件(通過socket、HTTP或者其他方式)讀取這些輸入。當幾行文本到來時,spout把它們傳送給bolt,bolt負責把文本分詞。接着數據流被傳送到另外一個bolt,這個bolt負責在一個已經定義好的政治家名單進行比對。如果匹配到了,將數據庫中對應的名字的計數加1。任何時候你想看結果,只要從數據庫中查詢就可以,因爲當數據到達時整個過程都是實時更新的。這過程中所有的組件(spout和bolt)以及他們之間的連接被稱爲拓撲(topology)(見圖表 1-1)。

現在很容易想象定義每個bolt和spout並行度,這樣可以無限地擴展整個拓撲。很神奇,對吧?儘管前面講的只是一個簡單的例子,不過你大概已經隱約感覺到Storm的強大了。

那麼,Storm適用什麼應用場景呢?

  • 數據流處理:正如上述的例子,Storm不像其他流處理系統,因爲Storm不需要中間隊列。
  • 持續計算:持續地向客戶端發送數據,它們可以實時的更新以及展現數據,比如網站指標。
  • 分佈式遠程過程調用:輕鬆地並行化CPU密集型操作。

(補充)從業務場景上,舉例說明Storm的可以處理的具體業務(這部分是黃崇遠總結的,覺得比較全面,摘抄在此)

  • 條件過濾:這是Storm最基本的處理方式,對符合條件的數據進行實時過濾,將符合條件的數據保存下來,這種實時查詢的業務需求再實際應用中很常見。
  • 中間計算:我們需要改變數據中某一個字段(例如是數值),我們需要利用一箇中間值經過計算(值比較、求和、求平均等等)後改變該值,然後將數據重新輸出。
  • 求TopN:相信大家對TopN類的業務需求也比較熟悉,在規定時間窗口內,統計數據出現的TopN,該類處理在購物及電商業務需求中,比較常見。
  • 推薦系統:有時候在實時處理時會從mysql及hadoop中獲取數據庫中的信息,例如在電影推薦系統中,傳入數據爲:用戶當前點播電影信息,從數據庫中獲取的是該用戶之前的一些點播電影信息統計,例如點播最多的電影類型、最近點播的電影類型,及其社交關係中點播信息,結合本次點擊及從數據庫中獲取的信息,生成推薦數據,推薦給該用戶。並且該次點擊記錄將會更新其數據庫中的參考信息,這樣就是實現了簡單的智能推薦。
  • 分佈式RPC:Storm有對RPC進行專門的設計,分佈式RPC用於對Storm上大量的函數進行並行計算,最後將結果返回給客戶端。
  • 批處理:所謂批處理就是數據積攢到一定觸發條件,就批量輸出,所謂的觸發條件類似事件窗口到了,統計數量夠了即檢測到某種數據傳入等等。
  • 熱度統計:熱度統計實現依賴於Storm提供的TimeCacheMap數據結構,現在可能推薦用RotatingMap,關於這兩個數據結構的源碼分析,移步Storm TimeCacheMap RotatingMap源碼分析,該結構能夠在內存中保存近期活躍的對象。我們可以使用它來實現例如論壇中熱帖排行計算等。

 

Storm組件

在Storm集羣中,節點被一個主控節點管理,並持續運行。

在Storm集羣中有兩類節點:主控節點和工作節點。主控節點跑一個後臺進程Nimbus,它負責在集羣中分發代碼,把任務安排給工作節點,監控任務是否失敗。工作節點跑後臺進程叫Supervisor來執行拓撲的部分功能。Storm的拓撲會在不同機器的工作節點上運行。

因爲Storm把集羣的狀態存在Zookeeper或者本地磁盤,所以後臺進程都是無狀態的(不需要保存自己的狀態,都在zookeeper上),可以在不影響系統健康運行的同時失敗或重啓。(見圖1-2)

在底層Storm使用了zeromq(0mq,zeromq(http://www.zeromq.org)),一個先進的嵌入式的網絡通訊庫,提供了很棒的功能使得Storm成爲可能。以下是zeromq的特點:

  • 支持高併發框架的Socket庫
  • 比TCP更快,適用於集羣產品和超級計算
  • 通過進程內通信,進程間通信,TCP和多播的形式傳遞消息
  • 異步的I/O,服務於可擴展的多核消息傳輸應用
  • 通過扇出(fanout),發佈訂閱,管道,請求應答實現多對多連接

 Storm用了push/pull套接字api

 

(補充:Storm組件的命名方式)

Storm暴風雨:其組件大多也以氣象名詞命名

spout龍捲:形象的理解是把原始數據捲進Storm流式計算中

bolt雷電:從spout或者其他bolt中接收數據進行處理或者輸出

nimbus雨雲:主控節點,存在單點問題,不過可以用watchdog來保證其可用性,fast-fail後馬上就啓動

topology拓撲:Storm的任務單元,形象的理解拓撲的點是spout或者bolt,之間的數據流是線,整個構成一個拓撲

 

Storm的特性

所有的設計概念和決策,使得Storm擁有諸多美好的特性,Storm變得獨一無二。

  • 編程簡單:如果你曾經嘗試實時處理抓取的內容,就知道這個過程有多痛苦。但是Storm顯著的降低了編碼複雜度。
  • 支持多種編程語言:用基於JVM的語言會比較簡單,但是Storm也支持任意其他語言,只要使用或者實現一個很小的中間件。(第七章有一個php的例子)
  • 容錯性:Storm可以處理工作節點的宕機,在適當的時候重新安排任務。
  • 可擴展性:爲了擴展,你需要做的就是往集羣里加更多的機器。Storm會往可用的新機器上分配任務。
  • 可靠性:所有的消息保證至少都能處理一次。如果發生錯誤,這些消息會被處理多次,但從不會丟失數據。
  • 高效:速度是驅動Storm設計的一個重要指標。
  • 事務性:對於絕大部分運算來說,你可以得到消息一次消費的語義。

 

 《Getting started with Storm》譯文HomePage 譯文索引

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章