共計 3523 個字符,預計需要花費 9 分鐘才能閱讀完成。
這篇文章主要介紹“Storm 的 Grouping 有哪些”,在日常操作中,相信很多人在 Storm 的 Grouping 有哪些問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Storm 的 Grouping 有哪些”的疑惑有所幫助!接下來,請跟著丸趣 TV 小編一起來學習吧!
##Storm Grouping
shuffleGrouping
將流分組定義為混排。這種混排分組意味著來自 Spout 的輸入將混排,或隨機分發給此 Bolt 中的任務。shuffle grouping 對各個 task 的 tuple 分配的比較均勻。
fieldsGrouping
這種 grouping 機制保證相同 field 值的 tuple 會去同一個 task,這對于 WordCount 來說非常關鍵,如果同一個單詞不去同一個 task,那么統計出來的單詞次數就不對了。
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。這是一種比較特別的分組方法,用這種分組意味著消息的發送者指定由消息接收者的哪個 task 處理這個消息。只有被聲明為 Direct Stream 的消息流可以聲明這種分組方法。而且這種消息 tuple 必須使用 emitDirect 方法來發射。消息處理者可以通過 TopologyContext 來獲取處理它的消息的 taskid (OutputCollector.emit 方法也會返回 taskid)
##fieldsGrouping
如果你了解 Storm,我想你能明白其中的大多數 Grouping。這里的 Grouping 策略我想著重介紹一下 fieldsGrouping,也最難理解的。
fieldsGrouping 是按照數據中字段 Field 的值分組的。下面是我的測試代碼:
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout(words , new TestWordSpout(), 2);
builder.setBolt(exclaim2 , new DefaultStringBolt(), 5)
.fieldsGrouping(words , new Fields( word));
測試的例子 Spout 是 Storm 自帶的例子,Blot 代碼如下:
public void execute(Tuple tuple) {log.info( rev a message: + tuple.getString(0));
collector.emit(tuple, new Values(tuple.getString(0) + !!! ));
collector.ack(tuple);
public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields( word));
}
Storm 自帶的例子 Spout 能隨機的返回 code new String[] { nathan , mike , jackson , golda , bertels /code 列表中的幾個字符串。這也是測試 FieldGroup 的好例子。
按照我最早做 Storm 開始前的理解,既然是按照 Field 分組,那么是所有相同的 Field 值得數據都會到達一個 Blot 的。我測試很多次,其結果并不是這樣,一個 Blot 會收到多個不同的值。我沒有仔細探究 Storm 這樣分組有什么特別的地方,以至于自己對 Storm 的學習停滯了很長時間。
Storm 能保證所有相同 Field 值的數據到達的是相同的 Blot,但是不保證一個 Blot 只處理一個值域。
也就是說,所有值是 nathan 能到達到一個 Blot,但是到達同一個 Blot 的值可能有多個,如 nathan , mike 的數據都到達。
理解到這點上,fieldsGrouping 就算是理解了。
下面是測試日志:
9144 [Thread-35-exclaim2] INFO cn.pointways.dstorm.bolt.DefaultStringBolt - rev a message: bertels
9234 [Thread-35-exclaim2] INFO cn.pointways.dstorm.bolt.DefaultStringBolt - rev a message: mike
9245 [Thread-33-exclaim2] INFO cn.pointways.dstorm.bolt.DefaultStringBolt - rev a message: nathan
9335 [Thread-26-exclaim2] INFO cn.pointways.dstorm.bolt.DefaultStringBolt - rev a message: golda
9346 [Thread-26-exclaim2] INFO cn.pointways.dstorm.bolt.DefaultStringBolt - rev a message: golda
9437 [Thread-35-exclaim2] INFO cn.pointways.dstorm.bolt.DefaultStringBolt - rev a message: jackson
9447 [Thread-35-exclaim2] INFO cn.pointways.dstorm.bolt.DefaultStringBolt - rev a message: mike
9537 [Thread-26-exclaim2] INFO cn.pointways.dstorm.bolt.DefaultStringBolt - rev a message: golda
9548 [Thread-35-exclaim2] INFO cn.pointways.dstorm.bolt.DefaultStringBolt - rev a message: jackson
9639 [Thread-33-exclaim2] INFO cn.pointways.dstorm.bolt.DefaultStringBolt - rev a message: nathan
9649 [Thread-35-exclaim2] INFO cn.pointways.dstorm.bolt.DefaultStringBolt - rev a message: jackson
9740 [Thread-33-exclaim2] INFO cn.pointways.dstorm.bolt.DefaultStringBolt - rev a message: nathan
9749 [Thread-35-exclaim2] INFO cn.pointways.dstorm.bolt.DefaultStringBolt - rev a message: jackson
9841 [Thread-35-exclaim2] INFO cn.pointways.dstorm.bolt.DefaultStringBolt - rev a message: bertels
9850 [Thread-26-exclaim2] INFO cn.pointways.dstorm.bolt.DefaultStringBolt - rev a message: golda
由上面的日志可以看出,golda 這個值的數據,的確歸并到一個 Blot 處理的。線程編號:Thread-26-exclaim2。其它值也都是相同值都是在一個線程內被處理的。
到此,關于“Storm 的 Grouping 有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注丸趣 TV 網站,丸趣 TV 小編會繼續努力為大家帶來更多實用的文章!