storm基礎概念

2021-09-01 02:57:31 字數 4595 閱讀 9812

以官網的結構圖為例子

storm用來幹什麼這裡就不說了,主要說下storm的一些基礎知識。官宣連線:

原文翻譯:

其實官方文件已經介紹的非常詳細了,這裡只是對某些比較晦澀的地方進行一些說明。

storm 系統中包含以下幾個基本概念:

拓撲(topologies)

流(streams)

資料來源(spouts)

資料流處理元件(bolts)

資料流分組(stream groupings)

可靠性(reliability)

任務(tasks)

工作程序(workers)

storm 的拓撲是對實時計算應用邏輯的封裝,它的作用與 mapreduce 的任務(job)很相似,區別在於 mapreduce 的乙個 job 在得到結果之後總會結束,而拓撲會一直在集群中執行,直到你手動去終止它。拓撲還可以理解成由一系列通過資料流(stream grouping)相互關聯的 spout 和 bolt 組成的的拓撲結構。spout 和 bolt 稱為拓撲的元件(component)。

資料流(streams)是 storm 中最核心的抽象概念。乙個資料流指的是在分布式環境中並行建立、處理的一組元組(tuple)的無界序列。資料流可以由一種能夠表述資料流中元組的域(fields)的模式來定義。在預設情況下,元組(tuple)包含有整型(integer)數字、長整型(long)數字、短整型(short)數字、位元組(byte)、雙精度浮點數(double)、單精度浮點數(float)、布林值以及位元組陣列等基本型別物件。當然,你也可以通過定義可序列化的物件來實現自定義的元組型別。

在宣告資料流的時候需要給資料流定義乙個有效的 id。不過,由於在實際應用中使用最多的還是單一資料流的 spout 與 bolt,這種場景下不需要使用 id 來區分資料流,因此可以直接使用 outputfieldsdeclarer來定義「無 id」的資料流。實際上,系統缺省會給這種資料流定義乙個名為「default」的 id。

資料來源(spout)是拓撲中資料流的**。一般 spout 會從乙個外部的資料來源讀取元組然後將他們傳送到拓撲中。根據需求的不同,spout 既可以定義為可靠的資料來源,也可以定義為不可靠的資料來源。乙個可靠的spout 能夠在它傳送的元組處理失敗時重新傳送該元組,以確保所有的元組都能得到正確的處理;相對應的,不可靠的spout 就不會在元組傳送之後對元組進行任何其他的處理。

乙個 spout 可以傳送多個資料流。為了實現這個功能,可以先通過 outputfieldsdeclarer 的 declarestream 方法來宣告定義不同的資料流,然後在傳送資料時在 spoutoutputcollector 的 emit 方法中將資料流 id 作為引數來實現資料傳送的功能。

spout 中的關鍵方法是nexttuple。顧名思義,nexttuple 要麼會向拓撲中傳送乙個新的元組,要麼會在沒有可傳送的元組時直接返回。需要特別注意的是,由於 storm 是在同乙個執行緒中呼叫所有的 spout 方法,nexttuple 不能被 spout 的任何其他功能方法所阻塞,否則會直接導致資料流的中斷(關於這一點,阿里的 jstorm 修改了 spout 的模型,使用不同的執行緒來處理訊息的傳送,這種做法有利有弊,好處在於可以更加靈活地實現 spout,壞處在於系統的排程模型更加複雜,如何取捨還是要看具體的需求場景吧)。

spout 中另外兩個關鍵方法是ackfail,他們分別用於在 storm 檢測到乙個傳送過的元組已經被成功處理或處理失敗後的進一步處理。注意,ack 和 fail 方法僅僅對上述「可靠的」 spout 有效。

簡單的來講就是要處理的資料的源頭,storm官方將其形象的比喻為水龍頭。

拓撲中所有的資料處理均是由 bolt 完成的。通過資料過濾(filtering)、函式處理(functions)、聚合(aggregations)、聯結(joins)、資料庫互動等功能,bolt 幾乎能夠完成任何一種資料處理需求。

乙個 bolt 可以實現簡單的資料流轉換,而更複雜的資料流變換通常需要使用多個 bolt 並通過多個步驟完成。例如,將乙個微博資料流轉換成乙個趨勢影象的資料流至少包含兩個步驟:其中乙個 bolt 用於對每個的微博**進行滾動計數,另乙個或多個 bolt 將資料流輸出為「**最多的」結果(相對於使用2個bolt,如果使用3個 bolt 你可以讓這種轉換具有更好的可擴充套件性)。

bolt 可以將其理解為乙個具有處理功能的spout,它既可以處理資料,也可以向後面的bolt 發射資料。與spout一樣bolt 也有ack 和 fail 方法,用於可靠的資料處理

為拓撲中的每個 bolt 的確定輸入資料流是定義乙個拓撲的重要環節。資料流分組定義了在 bolt 的不同任務(tasks)中劃分資料流的方式。

在 storm 中有八種內建的資料流分組方式(原文有誤,現在已經已經有八種分組模型——譯者注),而且你還可以通過customstreamgrouping 介面實現自定義的資料流分組模型。這八種分組分時分別為:

隨機分組(shuffle grouping):這種方式下元組會被盡可能隨機地分配到 bolt 的不同任務(tasks)中,使得每個任務所處理元組數量能夠能夠保持基本一致,以確保集群的負載均衡。

域分組(fields grouping):這種方式下資料流根據定義的「域」來進行分組。例如,如果某個資料流是基於乙個名為「user-id」的域進行分組的,那麼所有包含相同的「user-id」的元組都會被分配到同乙個任務中,這樣就可以確保訊息處理的一致性。

部分關鍵字分組(partial key grouping):這種方式與域分組很相似,根據定義的域來對資料流進行分組,不同的是,這種方式會考慮下游 bolt 資料處理的均衡性問題,在輸入資料來源關鍵字不平衡時會有更好的效能。感興趣的讀者可以參考這篇**,其中詳細解釋了這種分組方式的工作原理以及它的優點。

完全分組(all grouping):這種方式下資料流會被同時傳送到 bolt 的所有任務中(也就是說同乙個元組會被複製多份然後被所有的任務處理),這種情況會使得資料被重複處理,使用這種分組方式要特別小心。(有點類似於訊息佇列裡面的廣播概念)

全域性分組(global grouping):這種方式下所有的資料流都會被傳送到 bolt 的同乙個任務中,也就是 id 最小的那個任務,也就是將所有資料流彙總到乙個bolt。

非分組(none grouping):使用這種方式說明你不關心資料流如何分組。目前這種方式的結果與隨機分組完全等效,不過未來 storm 社群可能會考慮通過非分組方式來讓 bolt 和它所訂閱的 spout 或 bolt 在同乙個執行緒中執行。

直接分組(direct grouping):這是一種特殊的分組方式。使用這種方式意味著元組的傳送者可以指定下游的哪個任務可以接收這個元組。只有在資料流被宣告為直接資料流時才能夠使用直接分組方式。使用直接資料流傳送元組需要使用 outputcollector 的其中乙個 emitdirect 方法。bolt 可以通過 topologycontext 來獲取它的下游消費者的任務 id,也可以通過跟蹤 outputcollector 的 emit 方法(該方法會返回它所傳送元組的目標任務的 id)的資料來獲取任務 id。

本地或隨機分組(local or shuffle grouping):如果在源元件的 worker 程序裡目標 bolt 有乙個或更多的任務執行緒,元組會被隨機分配到那些同程序的任務中。換句話說,這與隨機分組的方式具有相似的效果。

storm 可以通過拓撲來確保每個傳送的元組都能得到正確處理。通過跟蹤由 spout 發出的每個元組構成的元組樹可以確定元組是否已經完成處理。每個拓撲都有乙個「訊息延時」引數,如果 storm 在延時時間內沒有檢測到元組是否處理完成,就會將該元組標記為處理失敗,並會在稍後重新傳送該元組。

為了充分利用 storm 的可靠性機制,你必須在元組樹建立新結點的時候以及元組處理完成的時候通知 storm。這個過程可以在 bolt 傳送元組時通過 outputcollector 實現:在 emit 方法中實現元組的錨定(anchoring),同時使用 ack 方法表明你已經完成了元組的處理。

簡單點來講就是在emit乙個,必須對發射的元組進行錨定(可以想象為與乙個id相對應),然後發射成功時呼叫ack方法進行確認,失敗是呼叫fail方法通知spout一遍重新傳送該條元組。後面會在例子中實現乙個可靠的wordcount例子來加以說明。

在 storm 集群中每個 spout 和 bolt 都由若干個任務(tasks)來執行。每個任務都與乙個執行執行緒相對應。資料流分組可以決定如何由一組任務向另一組任務傳送元組。你可以在 topologybuilder 的 setspout 方法和 setbolt 方法中設定 spout/bolt 的並行度。

拓撲是在乙個或多個工作程序(worker processes)中執行的。每個工作程序都是乙個實際的 jvm 程序,並且執行拓撲的乙個子集。例如,如果拓撲的並行度定義為300,工作程序數定義為50,那麼每個工作程序就會執行6個任務(程序內部的執行緒)。storm 會在所有的 worker 中分散任務,以便實現集群的負載均衡。

Storm篇 Storm基礎概念

一 前述 storm是個實時的 分布式以及具備高容錯的計算系統,storm程序常駐記憶體,storm資料不經過磁碟,在記憶體中處理。二 相關概念 1.非同步 流式處理 非同步 客戶端提交資料進行結算,並不會等待資料計算結果。2.同步 實時請求應答服務 同步 客戶端提交資料請求之後,立刻取得計算結果並...

Storm 核心概念

核心概念 topologies 拓撲,將整個流程串起來 計算拓撲,由spout和bolt組成 類似於mr作業 mr最終要完成,topology會一直執行除非自己殺死 對應的資源 topologybuilder running topologies on a production cluster lo...

Storm概念理解

組成 topology是storm裡的最高抽象概念,相當於hadoop裡的mapreduce,topology 流轉換圖 由spouts和bolts組成。spout建立stream,stream由無限的tuple 元組 構成。bolts接收spout流出的tuple並進行處理,處理後生成的新的tup...