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