1. 程式人生 > >最通俗易懂Storm教程

最通俗易懂Storm教程

開發十年,就只剩下這套架構體系了! >>>   

概述:

storm叢集有nimbus、supervisor組成

storm叢集nimbus只有一個,supervisor可以多個

講故事:

故事1:

nimbus就是老闆,supervisor就是包工頭,worker就是工人。

Topology就是一車磚頭,根據磚頭的數量決定工人數量,然後worker就自己去幹活吧,規定的時間必須把活幹完,worker啟動多執行緒幹也行,但是每個worker之間要配合好(分組)。

故事2:

storm叢集的工作原理有點像ansible+dubbo+java應用的架構。(多個worker)ansible可以把把一個java應用在一臺機器上部署多個,(worker裡面的多執行緒)java應用裡面有一個執行緒池,(歸組)java應用之間可以通過dubbo互相呼叫。區別是dubbo呼叫時主動呼叫服務,而Topology是資料流向同一分組中繼續流動。

1、條件過濾
    這是storm最基本的處理方式,對符合條件的資料進行實時過濾,將符合條件的資料儲存下來,這種實時查詢的業務需求在實際應用中很常見。
2、中介軟體計算
    我們需要改變資料中某一個欄位(例如是數值),我們需要利用一箇中間值經過計算(值比較、求和、求平均等)後改變該值,然後將資料重新輸出。
3、求TopN
    相信大家對TopN類的業務需求也是比較熟悉的,在規定的時間視窗內,統計資料出現的TopN,該類處理在購物及電商業務需求中,比較常見。
4、分散式RPC
    storm有對RPC進行專門的設計,分散式RPC用於對storm上大量的函式呼叫進行平行計算,最後將結果返回給客戶端。
5、推薦系統
    在實時處理時從mysql及hadoop中獲取資料庫中的資訊,例如在電影推薦系統中,傳入資料為使用者當前點播電影資訊,從後資料庫中獲取的是該使用者之前的一些點播電影資訊統計。
6、批處理
    所謂批處理就是資料積攢到一定觸發條件 ,就批量輸出,所謂的觸發條件類似事件視窗到了,統計數量夠了及檢測到某種資料傳入等等。
7、熱度統計
    熱度統計實現依賴於TimeCacheMap資料結構,該結構能夠在記憶體中保持近期活躍的物件。我們可以使用它來實現例如論壇中的熱帖排行統計等。

一、Storm到底是什麼?

1、mysql,hadoop與storm

mysql:事務性系統,面臨海量資料的尷尬
hadoop:離線批處理
storm:實時計算

2、storm的特點是什麼?
(1)支撐各種實時類的專案場景:實時處理訊息以及更新資料庫,基於最基礎的實時計算語義和API(實時資料處理領域);對實時的資料流持續的進行查詢或計算,同時將最新的計算結果持續的推送給客戶端展示,同樣基於最基礎的實時計算語義和API(實時資料分析領域);對耗時的查詢進行並行化,基於DRPC,即分散式RPC呼叫,單表30天資料,並行化,每個程序查詢一天資料,最後組裝結果

storm做各種實時類的專案都ok

(2)高度的可伸縮性:如果要擴容,直接加機器,調整storm計算作業的並行度就可以了,storm會自動部署更多的程序和執行緒到其他的機器上去,無縫快速擴容

擴容起來,超方便

(3)資料不丟失的保證:storm的訊息可靠機制開啟後,可以保證一條資料都不丟

資料不丟失,也不重複計算

(4)超強的健壯性:從歷史經驗來看,storm比hadoop、spark等大資料類系統,健壯的多的多,因為元資料全部放zookeeper,不在記憶體中,隨便掛都不要緊

特別的健壯,穩定性和可用性很高

(5)使用的便捷性:核心語義非常的簡單,開發起來效率很高
二、Storm的叢集架構以及核心概念

1、Storm的叢集架構

Nimbus,Supervisor,ZooKeeper,Worker,Executor,Task

   

2、Storm的核心概念

Topology,Spout,Bolt,Tuple,Stream


Topology 拓撲:務虛的一個概念

Spout:資料來源的一個程式碼元件,就是我們可以實現一個spout介面,寫一個java類,在這個spout程式碼中,我們可以自己嘗試去資料來源獲取資料,比如說從kafka中消費資料

bolt:一個業務處理的程式碼元件,spout會將資料傳送給bolt,各種bolt還可以串聯成一個計算鏈條,java類實現了一個bolt介面

一堆spout+bolt,就會組成一個topology,就是一個拓撲,實時計算作業,spout+bolt,一個拓撲涵蓋資料來源獲取/生產+資料處理的所有的程式碼邏輯,topology

tuple:就是一條資料,每條資料都會被封裝在tuple中,在多個spout和bolt之間傳遞

stream:就是一個流,務虛的一個概念,抽象的概念,源源不斷過來的tuple,就組成了一條資料流
三、Storm的並行度以及流分組

並行度:Worker->Executor->Task,沒錯,是Task

其實就是多個task共同執行

流分組:Task與Task之間的資料流向關係
策略:

Shuffle Grouping:隨機發射,負載均衡
Fields Grouping:根據某一個,或者某些個,fields,進行分組,那一個或者多個fields如果值完全相同的話,那麼這些tuple,就會發送給下游bolt的其中固定的一個task

你發射的每條資料是一個tuple,每個tuple中有多個field作為欄位

比如tuple,3個欄位,name,age,salary

{"name": "tom", "age": 25, "salary": 10000} -> tuple -> 3個field,name,age,salary

All Grouping
Global Grouping
None Grouping
Direct Grouping
Local or Shuffle Grouping

 

 

應用案例:

1、基於storm的應用系統:

(1)基於storm的網路爬蟲系統的設計與實現:

大體框架:

  眾所周知,爬蟲系統裡幾個必不可少的模組,像下載、解析、回寫待爬資源、儲存等,本質上他們像是一個責任鏈,但後一個module又基於前一個module,所以可以理解為一種流處理模型,從我們拿到待爬URL一直到處理完畢儲存資料,這是一個完整的過程。如您看到的這張圖,如果我們實現了storm化,那麼基於storm強大的功能,我們的爬蟲可以完美執行在storm叢集上,並且每類處理器我們都可以非常靈活的分配其執行緒數,耗時的處理我們多開幾個執行緒,可以實現資源合理利用,當然既然是叢集,你的某個任務具體執行在哪裡,storm已經幫您分配好了,並且幫我們實現了節點失效等處理。

  最後如果bolt間傳輸的訊息量比較大,有可能