Storm學習第二天

概念:

這一頁列出了Storm的主要概念和學習Storm的更多資源,這些概念包括:
1.Topologies
2.Streams
3.Spouts
4.Bolts
5.Stream groupings
6.Reliability
7.Tasks
8.Workers

1.Topologies:
           Storm topology包括實時應用的邏輯,一個Storm topology類似於一個MapReduce任務。二者主要的不同是MapReduce任務最終會結束,然而只要你不kill掉它,一個topology會一直運行。一個topology是一個被stream groupings連接的spouts和bolts的圖,這些概念在下面描述。

資源:
     http://storm.apache.org/releases/1.0.0/javadocs/org/apache/storm/topology/TopologyBuilder.html
     使用java用這個類構建topologies
     http://storm.apache.org/releases/1.0.0/Running-topologies-on-a-production-cluster.html
     在生產集羣上運行topologies
     http://storm.apache.org/releases/1.0.0/Local-mode.html
     通過閱讀這個學會在本地模式下開發和測試topologies
2.Streams:
         Stream是Storm的核心抽象,Stream是一個無限的以分佈式方式並行的創造和處理的順序的元組Stream以Stream的元組中包含的域這種方式來定義,默認的包括integer,long,short,byte,string,double,float,boolean和byte array這些數據類型,你也可以通過定義自己的序列化器使得自定義的客戶定製類型能夠在元組內被使用。每一個Stream被聲明的時候都給了一個id。因爲single-stream的spout和bolt很常見,OutputFieldsDeclarer有方便的方法不給single-stream一個特殊的id,在這種情況下,stream被給了一個默認的id。

資源:
     Tuple:http://storm.apache.org/releases/1.0.0/javadocs/org/apache/storm/tuple/Tuple.html Stream是由元組組成的
     OutputFieldsDeclarer:http://storm.apache.org/releases/1.0.0/javadocs/org/apache/storm/topology/OutputFieldsDeclarer.html
     用於聲明stream和他們的模式
     Serialization:http://storm.apache.org/releases/1.0.0/Serialization.html
     關於Storm的動態類型的元組和聲明客戶端的序列化類型
3.Spouts:
         Spout是在topology中的流的源頭,一般來講spouts將要從外部源中讀取元組並把他們發送到topology,spout可以分爲可依賴的和不可依賴的,一個可依賴的spout可以在Storm處理元組失敗後從新發送元組,然而一個不可依賴的spout發送完元組就不管了。
         Spout不僅僅可以發送一個流,爲了發送多個流,用OutputFieldsDeclarer的declareStream來聲明多個流,同時可以使用
SpoutOutputCollector的emit方法指定流發送到哪去。
         在Spout中的主方法是nextTuple,nextTupe可能是向topology發送一個新的元組,如果沒有新的元組,就簡單的返回,因爲Storm在一個線程裏面調用所有的spout方法,所以nextTuple必須不能阻塞。
         在Spout中的其他的主要方法是ack和fail,他們在Storm發現元組被topology成功處理或者失敗的時候被調用,ack和fail方法只有在可依賴的spout中被調用,看java doc可以得到更多的信息。
資源:
     IRichSpout:http://storm.apache.org/releases/1.0.0/javadocs/org/apache/storm/topology/IRichSpout.html
     這是Spout必須繼承的接口
     Guaranteeing message processing:http://storm.apache.org/releases/1.0.0/Guaranteeing-message-processing.html
4.Bolts:
        所有的處理都是在bolts中做,比如過濾,函數,聚合,連接,數據庫交互等等。
        bolts可以做簡單的流轉換。 做複雜的流轉換就需要很多步驟,也就需要很多bolts,例如,把一個微博的流轉爲熱門圖片的流至少需要二個步驟:一個bolt爲一個圖片做一個滾動的轉發數,一個或者更多的流去找出top X張照片(你可以用三個bolt來做這件事情,這件事情會比用二個bolts更方便)
        bolts能夠放出多個流,爲了實現這個功能,用OutputFieldsDeclarer的declareStream來聲明多個流,同時可以使用SpoutOutputCollector的emit方法指定流發送到哪去。
        當你聲明一個bolt的輸入流,你經常訂閱其他組件的特殊流,如果你想訂閱其他組件的所有流,你不得不一個一個的訂閱,訂閱默認的id的組件的時候,InputDeclarer有一種語法糖,比如declarer.shuffleGrouping("1")和declarer.shuffleGrouping("1", DEFAULT_STREAM_ID)是一樣的。
        在bolts中的主要方法是execute,這個方法需要一個新的元組作爲輸入,bolts使用OutputCollector對象發送一個新的元組。bolts對每一個處理的元組都必須調用OutputCollector的ack方法,這樣Storm才能知道元組被處理完畢(這樣才能通知原來的spout元組被處理完畢),處理輸入元組的常用情況,發送0或者更多的元組,然後反饋完成信息給輸入元組,Storm提供了IBasicBolt接口自動反饋完成信息。
       在bolts中開闢一個新的線程去異步處理是完全可以的,OutputCollector是線程安全的,可以在任何時候被調用。
資源:
     IRichBolt: 這是bolt的泛型接口
     IBasicBolt: 這是一個bolt的簡單的接口,可以做些過濾或者簡單的功能。
     OutputCollector: bolt用這個類的實例去釋放他們的元組
5.Stream groupings:
         有一些topology是特殊的,他的bolt把流作爲輸入,一個stream group定義了在如何分散到各個bolts中。
         在Storm中有8個內置的stream group,你也可以通過實現CustomStreamGrouping接口自定義stream group。
         1.Shuffle group:元組們被隨機的分散到各個bolt上,保證每個bolt有相同數量的元組。
         2.Fields group:這個流被特殊域分開,比如,如果流是根據user-id來分組的,一樣的user-id就去同樣的任務,不一樣的
           user-id去不同的任務
         3.Partial Key grouping:這個流被組裏的特殊域分開,很像上一個,但是在二個下游的bolt中是負載均衡的,這種能在
           輸入數據是不規則的時候提供較好的利用率,
         https://melmeric.files.wordpress.com/2014/11/the-power-of-both-choices-practical-load-balancing-for-
         distributed-stream-processing-engines.pdf這篇文章提供了它的工作原理和它的優勢。
         4.All group:這個流在所有的bolts任務中都是重複的,小心使用這個模式
         5.Global group:整個的流都去bolt任務的一個節點,比如,都去id最小的那個任務。
         6.None group:這個分組適用於你不關心流是怎麼被分組的,目前來說,這個分組和shuffle分組是一樣的,但是最終,Storm將要疊加bolts到一個線程作爲bolt或者他們訂閱的spout
         7.Direct group:這個是一種特殊的分組。使用這個分組意味着元組的生產者決定哪個任務處理這個元組,這個富足只能在stream是direct stream的時候才能使用,元組被髮送到直接流必須使用emitDirect方法,一個bolt要得到消費者的id有二種方法,一種是用TopologyContext,另一種是跟蹤OutputCollector的emit方法的輸出,這個方法返回元組發送到的任務id
         8.Local or shuffle group:如果目標bolt有一個或者更多的任務在一個worker進程中,元組被分發到那些進程內的任務,如果不是
           這個表現的就和shuffle一樣
資源:
     TopologyBuilder: 用這個類去定義topologies
     InputDeclarer: 當TopologyBuilder中的setBolt被調用的時候這個類用於聲明bolt的輸入流和這些流怎麼被分組
6.Reliability:
              Storm保證每一個spout元組都會被topology處理,它之所以能實現這個,是通過跟蹤每一個spout元組觸發的元組樹和決定什麼時候元組樹被成功的處理,每一個topology都有一個消息超時,如果spout元組沒有在規定時間內完成,他就是殺掉然後重新啓動。
              爲了充分利用Storm的穩定性優勢,你必須告訴Storm什麼時候元組樹的邊被創造並且在你處理完一個獨立的元組的時候一定要通知Storm,要實現這些可以使用OutputCollector對象,這個對象也是bolt用來發送元組的,前者是通過emit方法實現的,後者是通過ack方法實現的。
7.Tasks:
        每一個spout或者bolt在整個集羣中都是作爲很多任務執行的,每一個任務對應一個執行線程,stream grouping定義了怎樣從一組任務向另一組任務發送元組,可以在TopologyBuilder中的setSpout和setBolt方法中設置每個spout或者bolt的並行性。
8.Workers:
          topologies是通過一個或者多個worker進程執行的,每一個worker進程是一個物理的JVM並且執行所有任務的自己。例如,如果topology併發是300,50個work進程,那麼每個worker將要執行6個任務,(這些任務作爲worker中的線程),Storm把任務平均的
分散到所有的worker。

資源:
http://storm.apache.org/releases/1.0.0/javadocs/org/apache/storm/Config.html
這個配置設置執行topology的worker的數量。

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