天天看點

Storm 簡介及元件的基本概念

如果需要實作一個實時計算系統

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

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

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

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

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

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

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

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

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

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

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

Storm 是什麼

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

我們來看一下 Storm 的适用場景。

1.流資料處理:Storm可以用來用來處理源源不斷的消息,并将處理之後的結果儲存到資料庫中。

2.連續計算:Storm可以進行連續查詢并把結果即時回報給客戶,比如将熱門話題發送到用戶端,網站名額等。

3.分布式RPC:由于Storm的處理元件都是分布式的,而且處理延遲都極低,是以可以Storm可以做為一個通用的分布式RPC架構來使用。

Storm 中的一些概念

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

Storm 簡介及元件的基本概念

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

1. Nimbus:負責資源配置設定和任務排程。

2. Supervisor:負責接受nimbus配置設定的任務,啟動和停止屬于自己管理的worker程序。

3. Worker:運作具體處理元件邏輯的程序。

4. Task:worker中每一個 Spout /bolt的線程稱為一個task. 在 Storm 0.8之後,task不再與實體線程對應,同一個 Spout /bolt的task可能會共享一個實體線程,該線程稱為executor。

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

Storm 簡介及元件的基本概念

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等。

Storm 簡介及元件的基本概念
Storm 簡介及元件的基本概念

運作中的Topology :

•運作中的Topology主要由以下三個元件組成的:

•Worker processes(程序)

•Executors (threads)(線程)

•Tasks

Storm 簡介及元件的基本概念

Stream的概念

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

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

Storm 簡介及元件的基本概念

Stream Grouping

定義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性能。