strom基礎

strom 經典圖譜:

strom基礎

strom基礎

  1. Topologies
  2. Streams
  3. Spouts
  4. Bolts
  5. Stream groupings
  6. Reliability
  7. Tasks
  8. Workers
  9. Configuration

1、Topologies

一個topology是spouts和bolts組成的圖, 通過stream groupings將圖中的spouts和bolts連接起來,如下圖:
strom基礎
一個topology會一直運行直到你手動kill掉,Storm自動重新分配執行失敗的任務, 並且Storm可以保證你不會有數據丟失(如果開啓了高可靠性的話)。如果一些機器意外停機它上面的所有任務會被轉移到其他機器上。
運行一個topology很簡單。首先,把你所有的代碼以及所依賴的jar打進一個jar包。然後運行類似下面的這個命令:

storm jar all-my-code.jar backtype.storm.MyTopology arg1 arg2

這個命令會運行主類: backtype.strom.MyTopology, 參數是arg1, arg2。這個類的main函數定義這個topology並且把它提交給Nimbus。storm jar負責連接到Nimbus並且上傳jar包。
Topology的定義是一個Thrift結構,並且Nimbus就是一個Thrift服務, 你可以提交由任何語言創建的topology。上面的方面是用JVM-based語言提交的最簡單的方法。


2、Streams

消息流stream是storm裏的關鍵抽象。一個消息流是一個沒有邊界的tuple序列, 而這些tuple序列會以一種分佈式的方式並行地創建和處理。通過對stream中tuple序列中每個字段命名來定義stream。在默認的情況下,tuple的字段類型可以是:integer,long,short, byte,string,double,float,boolean和byte array。你也可以自定義類型(只要實現相應的序列化器)。
每個消息流在定義的時候會被分配給一個id,因爲單向消息流使用的相當普遍, OutputFieldsDeclarer定義了一些方法讓你可以定義一個stream而不用指定這個id。在這種情況下這個stream會分配個值爲‘default’默認的id 。
Storm提供的最基本的處理stream的原語是spout和bolt。你可以實現spout和bolt提供的接口來處理你的業務邏輯。


3、Spouts

消息源spout是Storm裏面一個topology裏面的消息生產者。一般來說消息源會從一個外部源讀取數據並且向topology裏面發出消息:tuple。Spout可以是可靠的也可以是不可靠的。如果這個tuple沒有被storm成功處理,可靠的消息源spouts可以重新發射一個tuple, 但是不可靠的消息源spouts一旦發出一個tuple就不能重發了。
消息源可以發射多條消息流stream。使用OutputFieldsDeclarer.declareStream來定義多個stream,然後使用SpoutOutputCollector來發射指定的stream。
Spout類裏面最重要的方法是nextTuple。要麼發射一個新的tuple到topology裏面或者簡單的返回如果已經沒有新的tuple。要注意的是nextTuple方法不能阻塞,因爲storm在同一個線程上面調用所有消息源spout的方法。
另外兩個比較重要的spout方法是ack和fail。storm在檢測到一個tuple被整個topology成功處理的時候調用ack,否則調用fail。storm只對可靠的spout調用ack和fail。


4、Bolts

所有的消息處理邏輯被封裝在bolts裏面。Bolts可以做很多事情:過濾,聚合,查詢數據庫等等。
Bolts可以簡單的做消息流的傳遞。複雜的消息流處理往往需要很多步驟,從而也就需要經過很多bolts。比如算出一堆圖片裏面被轉發最多的圖片就至少需要兩步:第一步算出每個圖片的轉發數量。第二步找出轉發最多的前10個圖片。(如果要把這個過程做得更具有擴展性那麼可能需要更多的步驟)。
Bolts可以發射多條消息流, 使用OutputFieldsDeclarer.declareStream定義stream,使用OutputCollector.emit來選擇要發射的stream。
Bolts的主要方法是execute, 它以一個tuple作爲輸入,bolts使用OutputCollector來發射tuple,bolts必須要爲它處理的每一個tuple調用OutputCollector的ack方法,以通知Storm這個tuple被處理完成了,從而通知這個tuple的發射者spouts。 一般的流程是: bolts處理一個輸入tuple, 發射0個或者多個tuple, 然後調用ack通知storm自己已經處理過這個tuple了。storm提供了一個IBasicBolt會自動調用ack。


5、Stream groupings

定義一個topology的其中一步是定義每個bolt接收什麼樣的流作爲輸入。stream grouping就是用來定義一個stream應該如果分配數據給bolts上面的多個tasks。
Storm裏面有7種類型的stream grouping

  1. Shuffle Grouping: 隨機分組, 隨機派發stream裏面的tuple,保證每個bolt接收到的tuple數目大致相同。
  2. Fields Grouping:按字段分組, 比如按userid來分組, 具有同樣userid的tuple會被分到相同的Bolts裏的一個task, 而不同的userid則會被分配到不同的bolts裏的task。
  3. All Grouping:廣播發送,對於每一個tuple,所有的bolts都會收到。
  4. Global Grouping:全局分組, 這個tuple被分配到storm中的一個bolt的其中一個task。再具體一點就是分配給id值最低的那個task。
  5. Non Grouping:不分組,這個分組的意思是說stream不關心到底誰會收到它的tuple。目前這種分組和Shuffle grouping是一樣的效果, 有一點不同的是storm會把這個bolt放到這個bolt的訂閱者同一個線程裏面去執行。
  6. Direct Grouping: 直接分組, 這是一種比較特別的分組方法,用這種分組意味着消息的發送者指定由消息接收者的哪個task處理這個消息。 只有被聲明爲Direct Stream的消息流可以聲明這種分組方法。而且這種消息tuple必須使用emitDirect方法來發射。消息處理者可以通過TopologyContext來獲取處理它的消息的task的id (OutputCollector.emit方法也會返回task的id)。
  7. Local or shuffle grouping:如果目標bolt有一個或者多個task在同一個工作進程中,tuple將會被隨機發生給這些tasks。否則,和普通的Shuffle Grouping行爲一致。

6、Reliability

Storm保證每個tuple會被topology完整的執行。Storm會追蹤由每個spout tuple所產生的tuple樹(一個bolt處理一個tuple之後可能會發射別的tuple從而形成樹狀結構),並且跟蹤這棵tuple樹什麼時候成功處理完。每個topology都有一個消息超時的設置,如果storm在這個超時的時間內檢測不到某個tuple樹到底有沒有執行成功, 那麼topology會把這個tuple標記爲執行失敗,並且過一會兒重新發射這個tuple。
爲了利用Storm的可靠性特性,在你發出一個新的tuple以及你完成處理一個tuple的時候你必須要通知storm。這一切是由OutputCollector來完成的。通過emit方法來通知一個新的tuple產生了,通過ack方法通知一個tuple處理完成了。
Storm的可靠性我們在第四章會深入介紹。


7、Tasks

每一個spout和bolt會被當作很多task在整個集羣裏執行。每一個executor對應到一個線程,在這個線程上運行多個task,而stream grouping則是定義怎麼從一堆task發射tuple到另外一堆task。你可以調用TopologyBuilder類的setSpout和setBolt來設置並行度(也就是有多少個task)。


8、Workers

一個topology可能會在一個或者多個worker(工作進程)裏面執行,每個worker是一個物理JVM並且執行整個topology的一部分。比如,對於並行度是300的topology來說,如果我們使用50個工作進程來執行,那麼每個工作進程會處理其中的6個tasks。Storm會盡量均勻的工作分配給所有的worker。


9、Configuration

Storm裏面有一堆參數可以配置來調整Nimbus, Supervisor以及正在運行的topology的行爲,一些配置是系統級別的,一些配置是topology級別的。default.yaml裏面有所有的默認配置。你可以通過定義個storm.yaml在你的classpath裏來覆蓋這些默認配置。並且你也可以在代碼裏面設置一些topology相關的配置信息(使用StormSubmitter)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章