storm中一些重要的概念:
spout(訊息源)
bolt(訊息處理者)
stream grouping(資料的分發方式)
topology(拓撲)
worker(工作程序)
task(執行具體邏輯的任務)
executor(執行task的執行緒)
configuration(配置)
程式設計模型:
物理模型:
worker程序:
一,計算拓撲:topology
乙個實時計算應用程式的邏輯在storm裡面被封裝到topology物件裡面,我們把它叫做計算拓補。storm裡面的topology相當於hadoop裡面的mapreduce job,
它們的關鍵區別是:乙個mapreduce job最終總是會結束的,而乙個storm的topoloy會一直執行,除非你顯式的殺死它。
乙個topology是spouts和bolts組成的圖狀結構,而連線spouts和bolts的則是stream groupings。
二,訊息源: spout
訊息源spouts是storm裡面乙個topology裡面的訊息生產者。一般來說訊息源會從乙個外部源讀取資料並且向topology裡面發出訊息: tuple。
訊息源spouts可以是可靠的也可以是不可靠的。乙個可靠的訊息源可以重新發射乙個tuple當這個tuple沒有被storm成功的處理,
但是乙個不可靠的訊息源spouts一旦發出乙個tuple就把它徹底忘了,也就不可能再發了。
訊息源spouts可以發射多條訊息流stream。要達到這樣的效果,使用outfieldsdeclarer.declarestream來定義多個stream, 然後使用spoutoutputcollector來發射指定的sream。
三,訊息處理者: bolt
所有的訊息處理邏輯被封裝在bolts裡面。 bolts可以做很多事情:過濾, 聚合, 查詢資料庫等等。
bolts的主要方法是execute, 它以乙個tuple作為輸入,bolts使用outputcollector來發射tuple, bolts必須要為它處理的每乙個tuple呼叫outputcollector的ack方法,以通知storm這個tuple被處理完成了。從而我們通知這個tuple的發射者spouts。 一般的流程是: bolts處理乙個輸入tuple, 發射0個或者多個tuple, 然後呼叫ack通知storm自己已經處理過這個tuple了。storm提供了乙個ibasicbolt會自動呼叫ack。
四,worker
supervisor會監聽分配給它那台機器的工作,根據需要啟動/關閉工作程序,這個工作程序就是worker
每乙個worker都會占用工作節點的乙個埠,這個埠可以在storm.yarm中配置。
乙個topology可能會在乙個或者多個工作程序裡面執行,每個工作程序執行整個topology的一部分,所以乙個執行的topology由執行在很多機器上的很多任務作程序組成。
五,task:任務
每乙個spout和bolt會被當作很多task在整個集群裡面執行。預設情況下每乙個task對應到乙個執行緒(executor),這個執行緒用來執行這個task,而stream grouping則是定義怎麼從一堆task發射tuple到另外一堆task。
六,配置configuration
storm裡面有一堆引數可以配置來調整nimbus, supervisor以及正在執行的topology的行為, 一些配置是系統級別的, 一些配置是topology級別的。所有有預設值的配置的預設配置是配置在default.xml裡面的。你可以通過定義個storm.xml在你的classpath厘公尺來覆蓋這些預設配置。並且你也可以在**裡面設定一些topology相關的配置資訊 – 使用stormsubmitter。當然,這些配置的優先順序是: default.xml < storm.xml < topology-specific配置。
七,訊息流:stream
訊息流是storm裡面的最關鍵的抽象。乙個訊息流是乙個沒有邊界的tuple序列, 而這些tuples會被以一種分布式的方式並行地建立和處理。 對訊息流的定義主要是對訊息流裡面的tuple的定義, 我們會給tuple裡的每個字段乙個名字。 並且不同tuple的對應欄位的型別必須一樣。 也就是說: 兩個tuple的第乙個欄位的型別必須一樣, 第二個欄位的型別必須一樣, 但是第乙個欄位和第二個字段可以有不同的型別。 在預設的情況下, tuple的字段型別可以是: integer, long, short, byte, string, double, float, boolean和byte array。 你還可以自定義型別 — 只要你實現對應的序列化器。
八,訊息分發策略:stream groupings
shuffle grouping:隨機分組,隨機派發stream裡面的tuple,保證每個bolt接收到的tuple數目相同。
fields grouping:按欄位分組,比如按userid來分組,具有同樣userid的tuple會被分到相同的bolts,而不同的userid則會被分配到不同的bolts。做wordcount場景的時候就必須使用這種分組策略。
all grouping:廣播傳送,對於每乙個tuple,所有的bolts都會收到。
global grouping: 全域性分組,這個tuple被分配到storm中的乙個bolt的其中乙個task。再具體一點就是分配給id值最低的那個task。
non grouping:不分組,這個分組的意思是說stream不關心到底誰會收到它的tuple。目前這種分組和shuffle grouping是一樣的效果,有一點不同的是storm會把這個bolt放到這個bolt的訂閱者同乙個執行緒裡面去執行。
direct grouping:直接分組, 這是一種比較特別的分組方法,用這種分組意味著訊息的傳送者指定由訊息接收者的哪個task處理這個訊息。只有被宣告為direct stream的訊息流可以宣告這種分組方法。而且這種訊息tuple必須使用emitdirect方法來發射。訊息處理者可以通過topologycontext來獲取處理它的訊息的taskid (outputcollector.emit方法也會返回taskid)
local or shuffle grouping:如果目標bolt有乙個或者多個task在同乙個工作程序中,tuple將會被隨機發生給這些tasks。否則,和普通的shuffle grouping行為一致。
Storm的重要概念
storm中一些重要的概念 spout 訊息源 bolt 訊息處理者 stream grouping 資料的分發方式 topology 拓撲 worker 工作程序 task 執行具體邏輯的任務 executor 執行task的執行緒 configuration 配置 程式設計模型 物理模型 wor...
Storm重要概念(3)
storm概念 spout 訊息源 bolt 訊息處理者 stream grouping 資料的分發方式 topology 拓撲 worker 工作程序 task 執行具體邏輯的任務 executor 執行task的執行緒 configuration 配置 storm裡面各個物件的示意圖 計算拓補 ...
Storm篇 Storm基礎概念
一 前述 storm是個實時的 分布式以及具備高容錯的計算系統,storm程序常駐記憶體,storm資料不經過磁碟,在記憶體中處理。二 相關概念 1.非同步 流式處理 非同步 客戶端提交資料進行結算,並不會等待資料計算結果。2.同步 實時請求應答服務 同步 客戶端提交資料請求之後,立刻取得計算結果並...