Storm組件介紹

(1)Topologies 拓撲

解釋:
拓撲相似一個集裝箱,全部的貨物都會存儲在集裝箱裏面最後被託運走,storm裏面全部的代碼和文件最終會被打包在一個拓撲中,而後提交在storm集羣中運行,相似於Hadoop中的一個MapReduce的做業,最大的區別在於MapReduce最終會主動中止,Storm的Topologies不會主動中止,除非你強制kill掉它

相關拓展:

TopologyBuilder : Java裏面構造Topology工具類

生產模式
Config conf = new Config();
conf.setNumWorkers(20);
conf.setMaxSpoutPending(5000);
StormSubmitter.submitTopology("mytopology", conf, topology);
本地模式
import org.apache.storm.LocalCluster;
LocalCluster cluster = new LocalCluster();

(2)Streams 數據流

Stream是Storm裏面的核心抽象模型,在分佈式環境下一個數據流是由無限的tuple序列組成,這些經過數據源並行的源源不斷的被建立出來,Stream的schema是由一個字段名標識,值類型能夠是integer,long,shot,bytes,string,double,float,boolean,byte array固然咱們能夠自定義序列化類型。

每一個流在聲明時會被指定一惟一標識id,若是輸出的流只有一個能夠不用標識,默認指定的id是default


OutputFieldsDeclarer類負責輸出標識
單個流聲明:
declarer.declare(new Fields("single")
多個流聲明:
declarer.declareStream("a", new Fields("data", "time", "countyId")
declarer.declareStream("b", new Fields("data", "time", "countyId")
declarer.declareStream("c", new Fields("data", "time", "countyId")

相關拓展:
Tuple:streams由一系列tuple組成
OutputFieldsDeclarer:用於聲明流和他們的schema
Serialization:動態tuple類型和聲明自定義序列化

(3)Spouts (噴嘴比喻數據源)

一個spout是由流組成的數據源在storm的拓撲裏,一般狀況下會讀取外部的數據源
而後emit(發射)到拓撲裏面,好比是kafka,MySQL或者redis等等,Spout有兩種實現一種是可靠的消息實現,若是發送失敗則會重試,另一種是不可靠的消息實現可能會出現消息丟失,spout能夠一次聲明多個數據流經過OutputFieldsDeclarer類的declareStream方法,固然前提是你的SpoutOutputCollector裏的emit也是多個流

Spout裏面主要的方法是nextTuple,它裏面能夠發射新的tuple到拓撲,或者當沒有消息的時候就return,須要注意,這個方法裏面不能阻塞,由於storm調用spout方法是單線程的,其餘的主要方法是ack和fail,若是使用了可靠的spout,可使用ack和fail來肯定消息發送狀態

相關擴展:
IRichSpout:spout類必須實現的接口
BaseRichBolt :可靠的spout有ack確保
BaseBasicBolt :不可靠的spout

(4)Bolts 業務處理單元
全部的拓撲處理都會在bolt中進行,bolt裏面能夠作任何etl,好比過濾,函數,聚合,鏈接,寫入數據庫系統或緩存等,一個bolt能夠作簡單的事件流轉換,若是是複雜的流轉化,每每須要多個bolt參與,這就是流計算,每一個bolt都進行一個業務邏輯處理,bolt也能夠emit多個流到下游,經過declareStream方法聲明輸出的schema。

Bolt裏面主要的方法是execute方法,每次處理一個輸入的tuple,bolt裏面也能夠發射新的tuple使用OutputCollector類,bolt裏面每處理一個tuple必須調用ack方法以便於storm知道某個tuple什麼時候處理完成。Strom裏面的IBasicBolt接口能夠自動
調用ack。

相關拓展:
IRichBolt:bolts的通用接口
IBasicBolt:擴展的bolt接口,能夠自動處理ack
OutputCollector:bolt發射tuple到下游bolt裏面


(5)Stream grouping 流分組

分組定義了那個bolt能夠收到上游的數據流,流分組定義了stream應該怎樣在全部的bolt task中進行分區


目前storm內置8中分組接口能夠知足大多數應用開發,你也能夠經過 CustomStreamGrouping來自定義分組接口

(5.1)Shuffle grouping 隨機的分發數據流,保證每一個bolt能夠獲得相等數量的tuple

(5.2)Fields grouping
在grouping中stream經過字段進行分區分發,好比按照userid分組,那麼storm能保證在同一個task中收到的userid是同樣的,可是在不一樣的task中,他們的userid也是不同的

(5.3)Partial Key grouping
同Fields grouping相似,可是這個流分組能在數據有傾斜的狀況下作負載均衡

(5.4)All grouping
全部的bolt task都會收到此分組下的消息

(5.5)Global grouping
全部的stream都會發射到多個bolt task中的其中一個

(5.6)None grouping
等同於Shuffle grouping

(5.7)Direct grouping
由生產者控制把tuple直接發送到那個消費者的bolt中,須要在代碼裏面控制

(5.8)Local or shuffle grouping 

若是目標bolt有一個或多個task,在一個worker工做進程中,tuple僅僅會分發
到在同一個進程的task中,分發方式相似shuffle grouping

擴展:
TopologyBuilder:使用這個類定義拓撲
InputDeclarer: 聲明那些聲明的流能夠被指定的bolt接受

(6)Reliability 可靠性

使用ack保證,消息能夠超時和重試

(7)Tasks 任務
每一個spout和bolt會執行多個task橫跨整個集羣,每一個task會在一個線程中執行
stream grouping定義了每一個task送到到那個下游的task中,在使用TopologyBuilder時,可經過setSpout 和 setBolt方法進行設置

(8)Workers 工做者
Topologies執行會橫跨在一個或多個worker上,每一個worker是一個獨立的jvm,會執行全部task裏面的其中一部分task,好比一個拓撲的並行度是300而且有50個worker,那麼每一個worker上會執行6個task(6個線程在worker內部),storm會確保
全部的task儘可能均衡的分佈在全部worker中。

相關擴展:
設置worker數
conf..setNumWorkers(workNums);
相關文章
相關標籤/搜索