《Storm企業級應用:實戰、運維和調優》——3.5 Stream訊息流和StreamGrouping訊息流組

華章計算機發表於2017-07-03

本節書摘來自華章計算機《Storm企業級應用:實戰、運維和調優》一書中的第3章,第3.5節,作者:馬延輝 陳書美 雷葆華著, 更多章節內容可以訪問雲棲社群“華章計算機”公眾號檢視。

3.5 Stream訊息流和Stream Grouping訊息流組

Storm核心的抽象概念是“流”。流是一個分散式並行建立和處理的無界的連續元組(Tuple)。流通過給流元組中欄位命名來定義。在預設情況下,元組可以包含整型、長整型、短整型、位元組、字串、雙精度浮點數、單精度浮點數、布林型和位元組陣列。
3.5.1 Stream訊息流
訊息流是Storm中最關鍵的抽象,是一個沒有邊界的Tuple序列,這些Tuple以分散式的方式並行地建立和處理。定義訊息流主要是定義訊息流中的Tuple。Tuple的定義在3.1節已經做了詳細介紹,本章節不再累述。訊息流Tuple中的每個欄位都有一個名字,並且不同Tuple對應欄位的型別必須相同。兩個Tuple的第一個欄位的型別必須相同,第二個欄位的型別必須相同,但是第一個欄位和第二個欄位可以有不同的型別。
每個訊息流在定義時都會分配一個ID,因為單向訊息流很普遍,OutputFieldsDeclarer定義了一些方法可以定義一個流而不用指定其ID。在這種情況下,該流有一個預設的ID。
3.5.2 Stream Grouping訊息流組
定義Topology的其中一步是定義每個Bolt接受何種流作為輸入。Stream Grouping(訊息流組)就是用來定義一個流如何分配Tuple到Bolt。Storm包括6種流分組型別。
1)隨機分組(Shuffle Grouping):隨機分發元組到Bolt的任務,保證每個任務獲得相等數量的元組。
2)欄位分組(Fields Grouping):根據指定欄位分割資料流並分組。例如,根據“user-id”欄位,具有該欄位的Tuple被分到相同的Bolt,不同的“user-id”值則會被分配到不同的Bolt。
3)全部分組(All Grouping):對於每一個Tuple來說,所有的Bolt都會收到,所有的Tuple被複制到Bolt的所有任務上,需小心使用該分組。
4)全域性分組(Global Grouping):全部的流都分配到Bolt的同一個任務,就是分配給ID最小的Task。
5)無分組(None Grouping):不分組的含義是,流不關心到底誰會收到它的Tuple。目前無分組等效於隨機分組,不同的是Storm將把無分組的Bolt放到訂閱Bolt或Spout的同一執行緒中執行(在可能實現的前提下)。
6)直接分組(Direct Grouping):這是一個特別的分組型別。元組生產者決定元組由哪個元組消費者任務接收。該分組僅能被宣告為direct stream的流使用。元組必須通過emitDirect方法直接發射。Bolt獲取消費者任務ID,可以使用已提供的TopologyContext類或保持引用OutputCollector類的emit方法的輸出,元組傳送後返回任務ID列表。


相關文章