1.什麼是storm
Storm是Twitter開源的分佈式實時大數據處理框架,被業界稱爲實時版Hadoop。隨着越來越多的場景對Hadoop的MapReduce高延遲無法容忍,比如網站統計、推薦系統、預警系統、金融系統(高頻交易、股票)等等,大數據實時處理解決方案(流計算)的應用日趨廣泛,目前已是分佈式技術領域最新爆發點,而Storm更是流計算技術中的佼佼者和主流。
按照storm作者的說法,Storm對於實時計算的意義類似於Hadoop對於批處理的意義。Hadoop提供了map、reduce原語,使我們的批處理程序變得簡單和高效。同樣,Storm也爲實時計算提供了一些簡單高效的原語,而且Storm的Trident是基於Storm原語更高級的抽象框架,類似於基於Hadoop的Pig框架,讓開發更加便利和高效。
2.storm應用場景
推薦系統(實時推薦,根據下單或加入購物車推薦相關商品)、金融系統、預警系統、網站統計(實時銷量、流量統計,如淘寶雙11效果圖)、交通路況實時系統等等。
3.storm的一些特性
1.適用場景廣泛: storm可以實時處理消息和更新DB,對一個數據量進行持續的查詢並返回客戶端(持續計算),對一個耗資源的查詢作實時並行化的處理(分佈式方法調用,即DRPC),storm的這些基礎API可以滿足大量的場景。
2. 可伸縮性高: Storm的可伸縮性可以讓storm每秒可以處理的消息量達到很高。擴展一個實時計算任務,你所需要做的就是加機器並且提高這個計算任務的並行度 。Storm使用ZooKeeper來協調集羣內的各種配置使得Storm的集羣可以很容易的擴展。
3. 保證無數據丟失: 實時系統必須保證所有的數據被成功的處理。 那些會丟失數據的系統的適用場景非常窄, 而storm保證每一條消息都會被處理, 這一點和S4相比有巨大的反差。
4. 異常健壯: storm集羣非常容易管理,輪流重啓節點不影響應用。
5. 容錯性好:在消息處理過程中出現異常, storm會進行重試
6. 語言無關性: Storm的topology和消息處理組件(Bolt)可以用任何語言來定義, 這一點使得任何人都可以使用storm.
4.storm集羣結構
Nimbus 和Supervisors 之間所有的協調工作是通過 一個Zookeeper 集羣。 | |
Nimbus進程和 Supervisors 進程是無法直接連接,並且是無狀態的; 所有的狀態維持在Zookeeper中或保存在本地磁盤上。 |
|
意味着你可以 kill -9 Nimbus 或Supervisors 進程,而不需要做備份。 這種設計導致storm集羣具有令人難以置信的穩定性,並且無耦合。 |
5.storm工作原理
Nimbus 負責在集羣分發的代碼,topo只能在nimbus機器上提交,將任務分配給其他機器,和故障監測。
Supervisor,監聽分配給它的節點,根據Nimbus 的委派在必要時啓動和關閉工作進程。 每個工作進程執行topology 的一個子集。一個運行中的topology 由很多運行在很多機器上的工作進程組成。
在Storm中有對於流stream的抽象,流是一個不間斷的無界的連續tuple,注意Storm在建模事件流時,把流中的事件抽象爲tuple即元組
Storm認爲每個stream都有一個源,也就是原始元組的源頭,叫做Spout(管口)
處理stream內的tuple,抽象爲Bolt,bolt可以消費任意數量的輸入流,只要將流方向導向該bolt,同時它也可以發送新的流給其他bolt使用,這樣一來,只要打開特定的spout再將spout中流出的tuple導向特定的bolt,bolt又對導入的流做處理後再導向其他bolt或者目的地。
可以認爲spout就是水龍頭,並且每個水龍頭裏流出的水是不同的,我們想拿到哪種水就擰開哪個水龍頭,然後使用管道將水龍頭的水導向到一個水處理器(bolt),水處理器處理後再使用管道導向另一個處理器或者存入容器中。
爲了增大水處理效率,我們很自然就想到在同個水源處接上多個水龍頭並使用多個水處理器,這樣就可以提高效率。
這是一張有向無環圖,Storm將這個圖抽象爲Topology(拓撲),Topo就是storm的Job抽象概念,一個拓撲就是一個流轉換圖 |
|
圖中每個節點是一個spout或者bolt,每個spout或者bolt發送元組到下一級組件。 |
|
而Spout到單個Bolt有6種流分組策略。 |
6.Topology
Storm將流中元素抽象爲tuple,一個tuple就是一個值列表value list,list中的每個value可以是任意可序列化的類型。拓撲的每個節點都要說明它所發射出的元組的字段的name,其他節點只需要訂閱該name就可以接收處理。
7.storm相關概念
Streams:消息流
消息流是一個沒有邊界的tuple序列,而這些tuples會被以一種分佈式的方式並行創建和處理。 每個tuple可以包含多列,字段類型可以是: integer, long, short, byte, string, double, float, boolean和byte array。 你還可以自定義類型 — 只要你實現對應的序列化器。
Spouts:消息源
Spouts是topology消息生產者。Spout從一個外部源(消息隊列)讀取數據向topology發出tuple。 消息源Spouts可以是可靠的也可以是不可靠的。一個可靠的消息源可以重新發射一個處理失敗的tuple, 一個不可靠的消息源Spouts不會。
Spout類的方法nextTuple不斷髮射tuple到topology,storm在檢測到一個tuple被整個topology成功處理的時候調用ack, 否則調用fail。
storm只對可靠的spout調用ack和fail。
Bolts:消息處理者
消息處理邏輯被封裝在bolts裏面,Bolts可以做很多事情: 過濾, 聚合, 查詢數據庫等。
Bolts可以簡單的做消息流的傳遞。複雜的消息流處理往往需要很多步驟, 從而也就需要經過很多Bolts。第一級Bolt的輸出可以作爲下一級Bolt的輸入。而Spout不能有一級。
Bolts的主要方法是execute(死循環)連續處理傳入的tuple,成功處理完每一個tuple調用OutputCollector的ack方法,以通知storm這個tuple被處理完成了。當處理失敗時,可以調fail方法通知Spout端可以重新發送該tuple。
流程是: Bolts處理一個輸入tuple, 然後調用ack通知storm自己已經處理過這個tuple了。storm提供了一個IBasicBolt會自動調用ack。
Bolts使用OutputCollector來發射tuple到下一級Blot。
一組形象的對比: