Storm 簡介及元件的基本概念

2021-07-23 04:36:21 字數 4302 閱讀 4759

全量資料處理使用的大多是鼎鼎大名的hadoop或者hive,作為乙個批處理系統,hadoop以其吞吐量大、自動容錯等優點,在海量資料處理上得到了廣泛的使用。但是,hadoop不擅長實時計算,因為它天然就是為批處理而生的,這也是業界一致的共識。否則最近這兩年也不會有s4, storm ,puma這些實時計算系統如雨後春筍般冒出來啦。先拋開s4, storm ,puma這些系統不談,我們首先來看一下,如果讓我們自己設計乙個實時計算系統,我們要解決哪些問題。

● 低延遲。都說了是實時計算系統了,延遲是一定要低的。

● 高效能。效能不高就是浪費機器,浪費機器就是浪費錢。

● 分布式。系統都是為應用場景而生的,如果你的應用場景、你的資料和計算單機就能搞定,那麼不用考慮這些複雜的問題了。我們所說的是單機搞不定的情況。

● 可擴充套件。伴隨著業務的發展,我們的資料量、計算量可能會越來越大,所以希望這個系統是可擴充套件的。

● 容錯。這是分布式系統中通用問題。乙個節點掛了不能影響我的應用。

好,如果僅僅需要解決這5個問題,可能會有無數種方案,而且各有千秋,隨便舉一種方案,使用訊息佇列+分布在各個機器上的工作程序就可以了。

1. 容易在上面開發應用程式。你設計的系統需要應用程式開發人員考慮各個處理元件的分布、訊息的傳遞嗎?如果是,那有點麻煩啊,開發人員可能會用不好,也不會想去用。

2. 訊息不丟失。使用者發布的乙個寶貝訊息不能在實時處理的時候給丟了,對吧?更嚴格一點,如果是乙個精確資料統計的應用,那麼它處理的訊息要不多不少才行。這個要求有點高。

3. 訊息嚴格有序。有些訊息之間是有強相關性的,比如同乙個寶貝的更新和刪除操作訊息,如果處理時搞亂順序完全是不一樣的效果了。

不知道大家對這些問題是否都有了自己的答案,下面讓我們帶著這些問題,一起來看一看 storm 的吧。

如果只用一句話來描述 storm 的話,可能會是這樣:分布式實時計算系統。按照 storm 作者的說法, storm 對於實時計算的意義類似於hadoop對於批處理的意義。我們都知道,根據google mapreduce來實現的hadoop為我們提供了map、reduce原語,使我們的批處理程式變得非常地簡單和優美。同樣, storm 也為實時計算提供了一些簡單優美的原語。我們會在第三節中詳細介紹。

我們來看一下 storm 的適用場景。

1.流資料處理:storm可以用來用來處理源源不斷的訊息,並將處理之後的結果儲存到資料庫中。

2.連續計算:storm可以進行連續查詢並把結果即時反饋給客戶,比如將熱門話題傳送到客戶端,**指標等。

3.分布式rpc:由於storm的處理元件都是分布式的,而且處理延遲都極低,所以可以storm可以做為乙個通用的分布式rpc框架來使用。

首先我們通過乙個 storm 和 hadoop 的對比來了解 storm 中的基本概念。

接下來我們再來具體看一下這些概念。

1.nimbus:負責資源分配和任務排程。

2.supervisor:負責接受nimbus分配的任務,啟動和停止屬於自己管理的worker程序。

3.worker:執行具體處理元件邏輯的程序。

4.task:worker中每乙個 spout /bolt的執行緒稱為乙個task. 在 storm 0.8之後,task不再與物理執行緒對應,同乙個 spout /bolt的task可能會共享乙個物理執行緒,該執行緒稱為executor。

下面這個圖描述了以上幾個角色之間的關係:

5,topology: storm 中執行的乙個實時應用程式,因為各個元件間的訊息流動形成邏輯上的乙個拓撲結構。

6,spout:在乙個topology中產生源資料流的元件。通常情況下 spout 會從外部資料來源中讀取資料,然後轉換為topology內部的源資料。 spout 是乙個主動的角色,其介面中有個nexttuple()函式, storm 框架會不停地呼叫此函式,使用者只要在其中生成源資料即可。

7,bolt:在乙個topology中接受資料然後執行處理的元件。bolt可以執行過濾、函式操作、合併、寫資料庫等任何操作。bolt是乙個被動的角色,其介面中有個execute(tuple input)函式,在接受到訊息後會呼叫此函式,使用者可以在其中執行自己想要的操作。

8,tuple:一次訊息傳遞的基本單元。

9,stream:源源不斷傳遞的tuple就組成了stream。

10,stream grouping:即訊息的partition方法。流分組策略告訴topology如何在兩個元件之間傳送tuple。 storm 中提供若干種實用的grouping方式,包括shuffle, fields hash, all, global, none, direct和localorshuffle等。

•執行中的topology主要由以下三個元件組成的:

•worker processes(程序)

•executors (threads)(執行緒)

•stream是storm裡面的關鍵抽象。乙個stream是乙個沒有邊界的tuple序列。storm提供一些原語來分布式地、可靠地把乙個stream傳輸進乙個新的stream。

•通常spout會從外部資料來源(佇列、資料庫等)讀取資料,然後封裝成tuple形式,之後傳送到stream中,bolt可以接收任意多個輸入stream, 作一些處理, 有些bolt可能還會發射一些新的stream

定義topology的很重要的一部分就是定義資料流資料流應該傳送到那些bolt中。資料流分組就是將資料流進行分組,按需要進入不同的bolt中。可以使用storm提供的分組規則,也可以實現backtype.storm.grouping.customstreamgrouping自定義分組規則。storm定義了8種內建的資料流分組方法:

1. shuffle grouping(隨機分組):隨機分發tuple給bolt的各個task,每個bolt例項接收到相同數量的tuple;

2. fields grouping(按欄位分組):根據指定欄位的值進行分組。比如,乙個資料流按照」user-id」分組,所有具有相同」user-id」的tuple將被路由到同一bolt的task中,不同」user-id」可能路由到不同bolt的task中;

3. partial key grouping(部分key分組):資料流根據field進行分組,類似於按字段分組,但是將在兩個下游bolt之間進行均衡負載,當資源發生傾斜的時候能夠更有效率的使用資源。

4. all grouping(全複製分組):將所有tuple複製後分發給所有bolt的task。小心使用。

5. global grouping(全域性分組):將所有的tuple路由到唯一乙個task上。storm按照最小的task id來選取接收資料的task;(注意,當時用全域性分組是,設定bolt的task併發是沒有意義的,因為所有tuple都**到乙個task上。同時需要注意的是,所有tuple**到乙個jvm例項上,可能會引起storm集群某個jvm或伺服器出現效能瓶頸或崩潰)

6. none grouping(不分組):這種分組方式指明不需要關心分組方式。實際上,不分組功能與隨機分組相同。預留功能。

7. direct grouping(指向型分組):資料來源會呼叫emitdirect來判斷乙個tuple應該由哪個storm元件接收,只能在宣告了指向型的資料流上使用。

8. local or shuffle grouping(本地或隨機分組):當同乙個worker程序中有目標bolt,將把資料傳送到這些bolt中。否則,功能將與隨機分組相同。該方法取決與topology的併發度,本地或隨機分組可以減少網路傳輸,降低io,提高topology效能。

Storm基本概念

原文 寫在前面的話 請允許我廢話幾句。這個系列的文章發布的時間是在我完成了storm的專案開發之後才找出來時間寫的,在研究storm過程中,國內較好的參考文章實在有限,大多是入門和概念剖析。storm的googlegroup對於新手來說實在不友好。有經驗人士都不願意回答新手的一些 愚蠢 的問題。現在...

Storm 基本概念

storm 是乙個免費並開源的分布式實時計算系統。利用storm 可以很容易做到可靠地處理無限的資料流,像hadoop 批量處理大資料一樣,storm 可以實時處理資料。storm 集群的master 節點,負責分發使用者 指派給具體的supervisor 節點上的worker 節點,去執行topo...

Storm基本概念

storm為分布式實時計算提供了一組通用原語,可被用於 流處理 之中,實時處理訊息並更新資料庫。這是管理佇列及工作者集群的另一種方式。storm也可被用於 連續計算 continuous computation 對資料流做連續查詢,在計算時就將結果以流的形式輸出給使用者。它還可被用於 分布式rpc ...