簡單聊聊Storm的流分組策略


簡單聊聊Storm的流分組策略

首先我要強調的是,Storm的分組策略對結果有着直接的影響,不同的分組的結果一定是不一樣的。其次,不同的分組策略對資源的利用也是有着非常大的不同,本文主要講一講localOrShuffle這個分組對資源利用的重大改善。最后,不同的分組對項目的邏輯也起着至關重要的決定,比如在寫數據的時候不同的分組策略會導致死鎖。

簡單理解數據流分組

拓撲定義的一部分就是為每個Bolt指定輸入的數據流,而數據流分組則定義了在Bolt的task之間如何分配數據流。
目前的Storm1.1.0版本內置了8種流分組策略,除此之外你也可以通過實現 CustomStreamGrouping接口來實現自定義的流分組策略。下面將結合具體的需求場景來具體的聊聊這些內置的分組策略:

Shuffle grouping:

隨機分組:隨機的將tuple分發給bolt的各個task,每個bolt實例接收到相同數量的tuple。

Fields grouping:

按字段分組:根據指定的字段的值進行分組,舉個栗子,流按照“user-id”進行分組,那么具有相同的“user-id”的tuple會發到同一個task,而具有不同“user-id”值的tuple可能會發到不同的task上。這種情況常常用在單詞計數,而實際情況是很少用到,因為如果某個字段的某個值太多,就會導致task不均衡的問題。

Partial Key grouping:

部分字段分組:流由分組中指定的字段分區,如“字段”分組,但是在兩個下游Bolt之間進行負載平衡,當輸入數據歪斜時,可以更好地利用資源。本論文 提供了一個很好的解釋,說明它的工作原理以及它提供的優點。有了這個分組就完全可以不用Fields grouping了。

All grouping:

全復制分組:將所有的tuple都復制之后再分發給Bolt所有的task,每一個訂閱數據流的task都會接收到一份相同的完全的tuple的拷貝。

Global grouping:

全局分組:這種分組會將所有的tuple都發到一個taskid最小的task上。由於所有的tuple都發到唯一一個task上,勢必在數據量大的時候會造成資源不夠用的情況。

None grouping:

不分組:不指定分組就表示你不關心數據流如何分組。目前來說不分組和隨機分組效果是一樣的,但是最終,Storm可能會使用與其訂閱的bolt或spout在相同進程的bolt來執行這些tuple。這可能是節省資源最好的一種方式吧,但是目前並未實現。

Direct grouping:

指向分組:這是一種特殊的分組策略。以這種方式分組的流意味着將由元組的生成者決定消費者的哪個task能接收該元組。指向分組只能在已經聲明為指向數據流的數據流中聲明。tuple的發射必須使用emitDirect種的一種方法。Bolt可以通過使用TopologyContext或通過在OutputCollector(返回元組發送到的taskID)中跟蹤emit方法的輸出來獲取其消費者的taskID。

Local or shuffle grouping:

本地或隨機分組:和隨機分組類似,但是如果目標Bolt在同一個工作進程中有一個或多個任務,那么元組將被隨機分配到那些進程內task。簡而言之就是如果發送者和接受者在同一個worker則會減少網絡傳輸,從而提高整個拓撲的性能。有了此分組就完全可以不用shuffle grouping了。
本地或隨機分組對於並發度大的拓撲簡直是神器好吧,發一張圖讓你們見識見識。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM