Storm的一些基本概念
- Topology:數據流串連起來多個計算單元的執行圖
- Tuple:數據傳輸的形式
- Stream:兩個計算單元(節點)之間的Tuples無界序列
- Spout:從數據源獲取數據,不處理數據
- Bolt:對數據進行轉換或者計算
- Parallism hit:設置建立Spout或者Bolt實例的線程數
- Exetutors:JVM的一個線程,他能在運行時作改變,以應對數據增加,好比增加 到與tasks數量一致
- Tasks:在一個executor裏面的Spouts或者Bolts實例,運行時很差改變,好比 fields grouping,hash的bolts數量變了,沒法找到以前的bolt
- Anchoring:把當前節點的tuple錨定到輸入的tuple樹上去,手動emit須要加上 tuple一塊兒
- Ack:事件被成功處理,outputCollector標記,Spout發現tuple被徹底處理 了,會調用這個方法
- Fail:分不一樣的狀況標記tuple處理失敗,會從新從Spout再走一遍流程,Spout 在fail的狀況會調用這個方法
- worker:每個worker process是一個JVM
- worker Node:一個worker Node有多個worker,他是一個物理機或者是虛擬 機器
master
:有且僅有一個;Nimbus
:master節點運行的後臺,他發現一個worker node掛掉的時候,會自動重啓它;Supervisor
:worker node運行的後臺,與Nimbus通訊經過Zookeeper
Storm的Grouping策略
- Stream Grouping:數據如何在多個Spout實例和多個Bolt實例之間傳送
- shuffle grouping:每一個bolt實例之間收到的tuple數量基本是一致的
- fields grouping:同一個值的字段會被送到同一個bolt實例
- global grouping:整個流的tuple都會進入同一個bolt實例【至關於只有1 個實例的shuffle grouping】
Storm的一些方法基本用途
declareOutputFields:定義傳送tuple中值的名字
open:鏈接數據源,獲取數據
nextTuple:當storm已經練接好數據源,它來發送數據到下游
SpoutOutputCollector:發送tuple,處理失敗的tuple
複製代碼
- BaseBasicBolt:自動錨定並ack,適用於單個tuple進來,單個tuple出去
exetute:處理上游tuple,併發送tuple到下游,一個bolt的實例,它的
execute方法每次只處理一個tuple
prepare:初始化時候用
BasicOutputCollector:發送tuple,處理失敗的tuple
複製代碼
- TopologyBuilder:定義Spout與Bolt之間的關係,以及流分組的方式
- Config:作拓撲級別的配置
- StormTopology:TopologyBuilder的產物,並提交到集羣
- TickTuple:bolt級別設置定時觸發器,首先在config中設置Tick觸發時機,而後 經過tuple的streamId判斷是不是是Ticktuple.觸發的頻率storm會努力作 到預設值一致
Storm的重試
- 至多一次處理
tuple處理成功就成功,失敗就失敗,不作任何處理,即不保證可用。spout不傳tuple就能夠了
- 至少一次處理
每一個tuple必須處理成功至少一次,須要保證在spout,數據源,流錨定,tuple被ack或者fail
- 只處理一次
每一個tuple一單被處理成功,不能再次被處理。須要考慮:A 處理的任務是單元化的,B記錄單元化任務處理的結果。同時A,B兩步操做必須是原子操做。在處理單元任務,若是單元任務非冪等,那麼再次重作至關於至多處理了一次【場景1】,因此單元任務處理必須得保證是冪等的。
BaseBasicBolt和BaseRichBolt的一些差別
- baseBasicBolt:自動錨定。
錨定的時機:執行emit方法的那一刻;
ack:execute方法執行結束;
fail:execute執行過程當中出現任何問題;
- baseRichBolt: 須要編碼實現錨定ack和fail 。
錨定操做:emit的時候添加tuple -> emit(tuple,new Values(..));
ack:使用outputcollector.ack(tuple);
fail:要重發須要本身發送保存好的數據
Storm中各個節點之間的關係
附錄
本文來自<Storm實戰>。推薦。這本書能夠基本理解storm。node