概述:html
storm集羣有nimbus、supervisor組成java
storm集羣nimbus只有一個,supervisor能夠多個mysql
講故事:sql
故事1:數據庫
nimbus就是老闆,supervisor就是包工頭,worker就是工人。網絡
Topology就是一車磚頭,根據磚頭的數量決定工人數量,而後worker就本身去幹活吧,規定的時間必須把活幹完,worker啓動多線程幹也行,可是每一個worker之間要配合好(分組)。數據結構
故事2:多線程
storm集羣的工做原理有點像ansible+dubbo+java應用的架構。(多個worker)ansible能夠把把一個java應用在一臺機器上部署多個,(worker裏面的多線程)java應用裏面有一個線程池,(歸組)java應用之間能夠經過dubbo互相調用。區別是dubbo調用時主動調用服務,而Topology是數據流向同一分組中繼續流動。架構
一、條件過濾 這是storm最基本的處理方式,對符合條件的數據進行實時過濾,將符合條件的數據保存下來,這種實時查詢的業務需求在實際應用中很常見。 二、中間件計算 咱們須要改變數據中某一個字段(例如是數值),咱們須要利用一箇中間值通過計算(值比較、求和、求平均等)後改變該值,而後將數據從新輸出。 三、求TopN 相信你們對TopN類的業務需求也是比較熟悉的,在規定的時間窗口內,統計數據出現的TopN,該類處理在購物及電商業務需求中,比較常見。 四、分佈式RPC storm有對RPC進行專門的設計,分佈式RPC用於對storm上大量的函數調用進行並行計算,最後將結果返回給客戶端。 五、推薦系統 在實時處理時從mysql及hadoop中獲取數據庫中的信息,例如在電影推薦系統中,傳入數據爲用戶當前點播電影信息,從後數據庫中獲取的是該用戶以前的一些點播電影信息統計。 六、批處理 所謂批處理就是數據積攢到必定觸發條件 ,就批量輸出,所謂的觸發條件相似事件窗口到了,統計數量夠了及檢測到某種數據傳入等等。 七、熱度統計 熱度統計實現依賴於TimeCacheMap數據結構,該結構可以在內存中保持近期活躍的對象。咱們可使用它來實現例如論壇中的熱帖排行統計等。
1、Storm究竟是什麼?負載均衡
一、mysql,hadoop與storm
mysql:事務性系統,面臨海量數據的尷尬
hadoop:離線批處理
storm:實時計算
二、storm的特色是什麼?
(1)支撐各類實時類的項目場景:實時處理消息以及更新數據庫,基於最基礎的實時計算語義和API(實時數據處理領域);對實時的數據流持續的進行查詢或計算,同時將最新的計算結果持續的推送給客戶端展現,一樣基於最基礎的實時計算語義和API(實時數據分析領域);對耗時的查詢進行並行化,基於DRPC,即分佈式RPC調用,單表30天數據,並行化,每一個進程查詢一天數據,最後組裝結果
storm作各類實時類的項目都ok
(2)高度的可伸縮性:若是要擴容,直接加機器,調整storm計算做業的並行度就能夠了,storm會自動部署更多的進程和線程到其餘的機器上去,無縫快速擴容
擴容起來,超方便
(3)數據不丟失的保證:storm的消息可靠機制開啓後,能夠保證一條數據都不丟
數據不丟失,也不重複計算
(4)超強的健壯性:從歷史經驗來看,storm比hadoop、spark等大數據類系統,健壯的多的多,由於元數據所有放zookeeper,不在內存中,隨便掛都沒關係
特別的健壯,穩定性和可用性很高
(5)使用的便捷性:核心語義很是的簡單,開發起來效率很高
2、Storm的集羣架構以及核心概念
一、Storm的集羣架構
Nimbus,Supervisor,ZooKeeper,Worker,Executor,Task
二、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,就組成了一條數據流
3、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
應用案例:
一、基於storm的應用系統:
(1)基於storm的網絡爬蟲系統的設計與實現:
大致框架:
衆所周知,爬蟲系統裏幾個必不可少的模塊,像下載、解析、回寫待爬資源、存儲等,本質上他們像是一個責任鏈,但後一個module又基於前一個module,因此能夠理解爲一種流處理模型,從咱們拿到待爬URL一直處處理完畢存儲數據,這是一個完整的過程。如您看到的這張圖,若是咱們實現了storm化,那麼基於storm強大的功能,咱們的爬蟲能夠完美運行在storm集羣上,而且每類處理器咱們均可以很是靈活的分配其線程數,耗時的處理咱們多開幾個線程,能夠實現資源合理利用,固然既然是集羣,你的某個任務具體運行在哪裏,storm已經幫您分配好了,而且幫咱們實現了節點失效等處理。
最後若是bolt間傳輸的消息量比較大,有可能網絡是個瓶頸。