TWITTER STORM學習

1. storm的topology是從啓動開始一直運行,只要有tuple到來,各個環節就會被出發執行。

2. stream是storm的核心概念,一個stream是一個持續的tuple序列,這些tuple被以分佈式並行的方式創建和處理。

3. spouts是一個stream的源頭,spouts負責從外部系統讀取數據,並組裝成tuple發射出去,tuple被髮射後就開始再topology中傳播。

           spouts分爲可靠和不可靠兩類,可靠的spout在某個tuple在某個環節失敗後可以重新執行(replaying);不可靠的spout在某個tuple處理失敗後,僅僅簡單的忽略這個tuple的處理。

          一個spout可以發射多個stream,我們只需要多次調用OutputFieldsDeclarer.declareStream方法聲明多個流,然後再多次調用SpoutOutputCollector.emit方法發射多個tuple。

          spout中主要的方法是nextTuple,該方法負責從外部讀取數據,併發射一個tuple至topology。

          spout中的另外幾個主要的方法有ack和fail,這兩個方法當storm發現某個tuple在整個topology的所有節點上被成功的處理或者處理失敗時調用。

         另外需要注意的是,所有的spout方法儘量不要有能夠引入阻塞的邏輯,因爲所有的spout方法是在同一個線程中調用的,如果某個方法被阻塞,後續的方法調用也將會被阻塞。

4. bolt是storm中處理 數據的核心,storm中所有的數據處理都是在bolt中完成的,bolt中可以做很多種的數據處理工作,例如:filtering, functions, aggregations, joins, talking to databases。

           bolt是storm中數據處理topology中的一個節點,接受前面的節點發射的tuple,數據處理完後發射新的tuple。bolt可以接受前一個bolt或者spout發射的一個stream或者多個stream;bolt自身也可以發射一個或者多個stream。bolt發射多個stream的方法和spout一樣;bolt可以通過調用InputDeclarer.shuffleGrouping("1")方法設置接受一個或者多個stream。

            execute方法是bolt中的最主要的方法,該方法實現接受上一個單元發射的tuple,處理完髮射自己的tuple,這裏必須對接收到的每一個tuple執行ack操作。IBasicBolt類提供自動ack tuple的功能。

5.  stream groupings

     storm中的所有的bolt處理數據都是可以並行的,每一個bolt都會由一定數目的bolt任務負責處理。這就需要一個負載均衡策略來處理tuple處理的任務分派問題。流的分組(stream groupings),主要是控制(spout,bolt) 之間元組處理的負載分發策略的,storm提供了幾種內置的分發策略

         Shuffle grouping   隨機均勻分發到所有的bolts中

         Fields grouping    按照tuple中的某個字段分配任務,同一個key的tuple由同一個bolt處理,不同key的tuple可能由不同的bolt處理

        All grouping:           每一個tuple將會複製到每一個bolt中處理

        Global grouping: stream中的所有的tuple都會發送給同一個bolt任務處理,所有的tuple將會發送給擁有最小task_id的bolt任務處理

         None grouping: 不關注並行處理負載均衡策略時使用該方式,目前等同於shuffle grouping,另外storm將會把bolt任務和他的上游提供數據的任務安排在同一個線程下

         Direct grouping:  由tuple的發射單元直接決定tuple將發射給那個bolt,一般情況下是由接收tuple的bolt決定接收哪個bolt發射的tuple。

  Local or shuffle grouping:如果發射方bolt的任務和接收方的bolt任務再同一個工作進程下,則優先發送給同一個進程下的接收方bolt任務,否則和shuffle gouping策略一樣

6.nimbus和supervisor之間的協調是通過zookeeper實現的,nimbus和supervisor的守護進程都是快速失敗和無狀態的,隨時都可以kill掉,然後再啓動,程序運行不受影響。STORM把集羣的穩定性託付給了zookeeper,所以STORM集羣是相當穩定的,雖然nimbus只有一個節點,任何一個節點都可以隨時啓動成爲nimbus。

7.Transactional Topologies

           wiki上的transactional Topologies這篇文章對於理解批處理和trident很有幫助

      對於每一個BATCH數據,一個新的BaseBatchBolt 對象就會被創建,這個對象負責處理同一BATCH的數據,這個對象是在BATCHBOLTEXECTOR裏面執行的

             BatchBolt's that are marked as committers: The only difference between this bolt and a regular batch bolt is whenfinishBatch is called. A committer bolt hasfinishedBatch called during the commit phase. The commit phase is guaranteed to occur only after all prior batches have successfully committed, and it will be retried until all bolts in the topology succeed the commit for the batch. There are two ways to make aBatchBolt a committer, by having theBatchBolt implement theICommitter marker interface, or by using thesetCommiterBolt method inTransactionalTopologyBuilder.

8.guaranteeing mesage processing

            storm提供消息失敗後向spout傳播失敗消息的機制,消息失敗後會有ACER進程通知發送tuple的spout進程,該spout進程收到失敗消息後調用fail方法處理失敗的tuple。

            storm提供至少處理一次的機制支持。

    所以要實現bolt處理失敗後事務能夠回滾,重做。bolt和spout的數據處理邏輯是有一定的要求的。 

                        首先:要求SPOUT必須有重新發送失敗的tuple的能力。如果數據源支持事物,可以先回滾然後再次獲取數據;如果數據源不支持,則需要緩存尚未成功的tuple數據以備再次發射.

                        其次:要求所有的後續的bolt都支持事物回滾和重做。

9.trident

trident的難點是TransactionalSpout和state的運行機制以及實現!

Twitter Storm源代碼分析之CoordinatedBolt: http://xumingming.sinaapp.com/811/twitter-storm-code-analysis-coordinated-bolt/

10. 雜項

getComponentTasks :get for you both TaskIDs and TaskIDindex 

 OutputCollector#emit :return the list of task ids that the tuple was sent to


sql on storm https://github.com/epfldata/squall



發佈了88 篇原創文章 · 獲贊 15 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章