1. 程式人生 > >Storm應用場景詳解

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設計的一個重要指標。
  • 事務性:對於絕大部分運算來說,你可以得到訊息一次消費的語義。