Storm拓扑之Stream Grouping

Stream的分组策略

Stream Grouping – 定义了一个流在Bolt任务间该如何被切分,谁来处理哪些数据流,按照什么规则来分配.

随机分组

Shuffle Grouping- 随机分组, 随机派发stream里面的tuple,保证每个bolt接收到的tuple数目大致相同。

字段分组

Fields grouping – 根据指定字段的值进行分组。比如说,一个数据流根据’word’字段进行分组,所有具有相同的’word’字段值的tuple会路由到同一个bolt的task中。

广播分组

All grouping- 全复制分组(广播分组), 将所有的tuple复制后分发给所有的bolt task。每个订阅数据流的task都会接收到tuple的拷贝。

全局分组

Global Grouping- 全局分组:这种分组方式将所有的tuple路由到唯一一个task上。Storm按照最小的taskID来选取接收数据的task。注意!!当使用全局分组方式时,设置bolt的task并发度是没有意义的,因为所有tuple都转发到同一个task上了。使用全局分组的时候需要注意,因为所有tuple都转发到一个JVM实例上,可能会引起Storm集群中某个JVM或者服务器出现性能瓶颈或奔溃。

无分组

None Grouping – 不分组,这个分组的意思是说stream不关心到底谁会收到它的tuple。目前这种分组和Shuffle grouping是一样的效果, 有一点不同的是storm会把这个bolt放到这个bolt的订阅者同一个线程里面去执行。

直接分组

Direct Grouping — 直接分组, 这是一种比较特别的分组方法,用这种分组意味着消息的发送者指定由消息接收者的哪个task处理这个消息。 只有被声明为Direct Stream的消息流可以声明这种分组方法。而且这种消息tuple必须使用emitDirect方法来发射。消息处理者可以通过TopologyContext来获取处理它的消息的task的id (OutputCollector.emit方法也会返回task的id)。

本地或随机分组

Local or shuffle grouping – 本地或随机分组:和随机分组类似,但是,会将tuple分发给同一个worker内的bolt task(如果worker内有接收数据的bolt task)。其他情况下,采用随机分组的方式。取决于topology的并发度,本地或随机分组可以减少网络传输,从而提高topology性能。

作业:

自己探索并实现其中任意一种分组方式,并添加说明性注释和运行截图

代码下载:
1494-2021-09-18-storm_Chap2Ex

Views: 255

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注