8.storm中不同的流分组方式

package backtype.storm.topology;
import backtype.storm.generated.GlobalStreamId;
import backtype.storm.generated.Grouping;
import backtype.storm.grouping.CustomStreamGrouping;
import backtype.storm.tuple.Fields;

public interface InputDeclarer<T extends InputDeclarer> {
    //字段分组
    public T fieldsGrouping(String componentId, Fields fields);
    public T fieldsGrouping(String componentId, String streamId, Fields fields);

          //全局分组
    public T globalGrouping(String componentId);
   
public T globalGrouping(String componentId, String streamId);

    //随机分组
    public T shuffleGrouping(String componentId);
    public T shuffleGrouping(String componentId, String streamId);

        //本地或随机分组
    public T localOrShuffleGrouping(String componentId);
   
public T localOrShuffleGrouping(String componentId, String streamId);

        //无分组
    public T noneGrouping(String componentId);
   
public T noneGrouping(String componentId, String streamId);

        //广播分组
    public T allGrouping(String componentId);
   
public T allGrouping(String componentId, String streamId);

        //直接分组
    public T directGrouping(String componentId);
   
public T directGrouping(String componentId, String streamId);

        //自定义分组
    public T customGrouping(String componentId, CustomStreamGrouping grouping);
   
public T customGrouping(String componentId, String streamId, CustomStreamGrouping grouping);
   
    public T grouping(GlobalStreamId id, Grouping grouping);
}

1. 随机分组
随机分组( Shuffle Grouping )是最常用的流分组方式,它随机地分发元组到 Bolt 上的任 务,这样能保证每个任务得到相同数量的元组。
随机分组执行原子操作,这是非常有用的,例如数学运算。但是,如果操作不能被随机分发的话,应该考虑使用其他的分组方式,例如,在单词统计( WordCount )例子中,需要计算单词,就不适合使用随机分组。

  2. 字段分组
字段分组( Fields Grouping )根据指定字段对流进行分组。例如,如果流是按 user-id 字段进行分组,具有相同 user-id 的元组总是被分发到相同的任务,具有不同 user-id 的元组可能被分发到不同的任务。
字段分组是实现流连接和关联,以及大量其他的用例的基础。在实现上,字段分组使用取模散列来实现。

3. 广播分组
广播分组( All Grouping )是指流被发送到所有 Bolt 的任务中。使用这个分组方式时要 小心。

4. 全局分组
全局分组(
Global Grouping )是指全部流都发送到 Bolt 的同一个任务中,再具体一点,
是发送给 ID 最小的任务。

5. 无分组
假定你不关心流是如何分组的,则可以使用这种分组方式。目前这种分组和随机分组是一 样的效果,有一点不同的是 Storm 会把这个 Bolt 放到 Bolt 的订阅者的同一个线程中执行。

6. 直接分组
直接分组( Direct Grouping )是一种特殊的分组。这种方式的流分组意味着由元组的生产 者决定元组的消费者的接收元组的任务。直接分组只能在已经声明为直接流( Direct Stream ) 的流中使用,并且元组必须使用 emitDirect 方法来发射。 Bolt 通过 TopologyContext 对象或者 OutputCollector 类的 emit 方法的返回值,可以得到其消费者的任务 id 列表( List<Integer> )。

7. 本地或者随机分组
如果目标
Bolt 在同一工作进程存在一个或多个任务,元组会随机分配给这些任务。否则,
该分组方式与随机分组方式是一样的。

8. 自定义分组
可以自定义流分组的方式,通过实现 CustomStreamGrouping 接口来创建自定义的流分组。 CustomStreamGrouping 接口的定义如下:
public interface CustomStreamGrouping extends Serializable {
void prepare(WorkerTopologyContext context, GlobalStreamId stream, List

<Integer> targetTasks);
List<Integer> chooseTasks(int taskId, List<Object> values);
}
CustomStreamGrouping 接口主要有两个方法:prepare chooseTasks
CustomStreamGrouping 接口的具体实现,可以参考如下的代码类:
storm.trident.partition.GlobalGrouping
storm.trident.partition.IdentityGrouping
storm.trident.partition.IndexHashGrouping
backtype.storm.testing.NGrouping
builder.setBolt("exclaim2", new ExclamationBolt(), 2).shuffleGrouping("exclaim1");
builder.setBolt("exclaim2", new ExclamationBolt(), 2). customGrouping("exclaim1", new GlobalGrouping()); // 自定义时的区别!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值