Storm拓扑配置下LocalOrShuffle Grouping:Worker-3的Bolt能否接收元组?
问题解答:Worker-3上的Bolt是否会接收元组?
答案是不会,下面结合Storm的LocalOrShuffle Grouping规则和你的拓扑配置详细解释:
首先明确LocalOrShuffle Grouping的核心逻辑
这种分组策略的优先级非常明确:
- 当发送元组的组件(这里是Spout)所在的Worker进程中存在目标Bolt的实例时,只会将元组随机发送给同Worker内的Bolt实例,完全不会跨Worker发送;
- 只有当发送组件所在的Worker里没有目标Bolt实例时,才会退化为普通的Shuffle Grouping,将元组随机分发给所有Worker上的Bolt实例。
结合你的拓扑配置分析
你的配置细节:
- 2个Spout实例,部署在2个不同的Worker上(Worker-1和Worker-2),Worker-3没有部署任何Spout;
- 8个Bolt实例会被Storm均匀分配到3个Worker上(比如Worker-1分配3个、Worker-2分配3个、Worker-3分配2个,具体数量可能略有差异,但每个Worker至少有2个Bolt实例)。
基于这个配置:
- Worker-1上的Spout发送元组时,发现同Worker内存在Bolt实例,所以只会把元组发给Worker-1里的Bolt;
- Worker-2上的Spout发送元组时,同理,只会把元组发给Worker-2里的Bolt;
- Worker-3上没有任何Spout,自然不会有本地Spout给它的Bolt发元组,而其他Worker的Spout又只会发本地Bolt,所以Worker-3上的Bolt完全接收不到任何元组。
如果希望Worker-3上的Bolt也能接收元组,你可以考虑改用普通的Shuffle Grouping,或者调整拓扑的任务分配(不过在你的8个Bolt、3个Worker的配置下,很难让某个Spout所在Worker没有Bolt实例)。
内容的提问来源于stack exchange,提问作者Tarun Chabarwal
相关产品推荐
相关产品推荐

