(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);