Storm的消息分发策略

1.Shuffle grouping(随机分组)

tuple会被随机分发到所有bolt,每个bolt会得到相同数量的tuple,使得负载均衡。

 

2.Fields grouping(按字段分组)

按field分发,只能发送给相同field的bolt。

例如:

builder.setBolt("mybolt", new MyStoreBolt(), 5).fieldsGrouping("checkBolt", new Fields("uid"));

该bolt由5个任务task执行,相同uid的元组tuple被分配到同一个task进行处理;该task接收的元祖字段是mybolt发射出的字段信息,不受uid分组的影响。

该分组不仅方便统计而且还可以通过该方式保证相同uid的数据保存不重复(uid信息写入数据库中唯一);

 

3.Partial Key grouping(按部分字段分组)

新版本的Storm新增的分组。效果跟Fields grouping类似,但具有负载均衡的能力。

 

4.All grouping(广播分组)

所有tuple都会发送到所有bolt上。性能较低,请谨慎使用!

 

5.Global grouping(全局分组)

所有tuple只会发送到一个bolt上——id最小的bolt。

 

6.None grouping(不分组)

实现效果类似于随机分组。但在底层实现中,Storm会把没有分组的bolt放在其订阅的bolt或spout的线程中执行。即逻辑上是分发了,但在内存中执行没实际分发。

 

7.Direct grouping(直接分组)

用这种分组意味着消息的发送者指定由消息接收者的哪个task处理这个消息。只有被声明为direct stream的消息流可以声明这种分组方法。

而且这种消息的tuple必须使用emitDirect方法来发射。消息处理者可以通过TopologyContext来获取处理它的消息的taskid(OutputCollector.emit方法也会返回taskid)。

 

8.Local or shuffle grouping(本地或随机分组)

如果目标bolt有一个或者多个task在同一个worker进程中,tuple将会被分发到这些正在工作的task中。否则,效果等同于Shuffle Grouping。即优先把数据发送到本机的处理器,避免网络传输,减少资源消耗。

 

参考资料

https://storm.apache.org/releases/current/Concepts.html

https://blog.csdn.net/fenggms/article/details/83000175

https://www.cnblogs.com/zhaoyan001/p/7975618.html

https://blog.csdn.net/vessalasd1/article/details/50472123

 

posted @ 2021-11-21 20:39  Clotho_Lee  阅读(82)  评论(0编辑  收藏  举报