流分组

流分组为每一个Bolt指定应该接受哪个流作为输入,定义了流/元组如何让在Bolt的任务之间进行分发。

在设计拓扑的时候,需要做一件非常重要的事情,就是定义数据如何在组件之间进行的交换。一个流分组指定每个Bolt消耗哪个流,流将如何被消耗。一个节点可以发出许多流,流分组允许我们有选择地接受流。

Storm内置了7种流分组方式,通过实现CustomStreamGrouping接口可以实现自定义的分组。

1.随机分组(ShuffleGrouping)

它是最常用的流分组方式,它随机的分发元组到Bolt上的任务,这样就保证每个任务得到相同数量地元组。

代码:public T shuffleGrouping(String componentId);

public T shuffleGrouping(String componentId,String streamId);

2.字段分组(Fields Grouping)

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

代码:   public T fieldsGrouping(String componentId,Fields fields);

public T fieldsGrouping(String componentId,String streamId,Fields fields);

3.广播分组(AllGrouping)

它是指流被发送到所有的Bolt的任务中,使用这个分组时要小心。

代码:public T allGrouping(String componentId);

public T allGrouping(String componentId,String streamId);

4.全局分组(GlobalGrouping)

它是指全部流都发送到Bolt的同一个任务中,再具体一点就是发送给ID最小的任务。

代码:public T globalGrouping(String componentId);

public T globalGrouping(String componentId,String streamId);

5.无分组(NoneGrouping)

如果你不关心流是如何分组的,则可以选择这种分组方式。这种分组方式和随机分组有一种不同之处在于Storm会把这个Bolt放到Bolt的订阅者的同一个线程中执行。

代码:public T noneGrouping(String componentId);

public T noneGrouping(String componentId,String streamId);

6.直接分组(Direct Grouping)

它是一种特殊的分组。这种方式的流分组意味着由元组的生产者决定元组的消费者的接收元组的任务。直接分组只能在已经声明为直接流的流中使用,并且元组必须使用emitDirect方法来发射。

代码:public T directGrouping(String componentId);

public T directGrouping(String componentId,String streamId);

7.本地或者随机分组(LocalOrshuffleGrouping)

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

代码:public T localOrshuffleGrouping(String componentId);

public T localOrshuffleGrouping(String componentId,String streamId);

时间: 2024-10-05 03:37:38

流分组的相关文章

storm流分组

流分组 在设计一个topology的时候,你需要做的最重要的事情是定义数据在组件之间怎样交换(流怎样被bolts消费).流分组指定了每个bolt消费哪些流和这些流被怎样消费. 一个结点可以发射不止一条数据流.流分组允许我们选择接收哪些流. 正如我们在第二章看到的,当topology被定义的时候流分组就被设置好了: ... builder.setBolt("word-normalizer", new WordNormalizer()) .shuffleGrouping("wor

storm的流分组

用的是ShuffleGrouping分组方式,并行度设置为3 这是跑下来的结果 参考代码StormTopologyShufferGrouping.java package yehua.storm; import java.util.Map; import org.apache.storm.Config;import org.apache.storm.LocalCluster;import org.apache.storm.StormSubmitter;import org.apache.stor

java8 新特性 Stream流 分组 排序 过滤 多条件去重

private static List<User> list = new ArrayList<User>(); public static void main(String[] args) { list = Arrays.asList( new User(1, "a", 10), new User(4, "d", 19), new User(5, "e", 13), new User(2, "b", 1

Stream流分组,统计,求和

public class Test { public static void main(String[] args) { List<OrdersDO> list = new ArrayList<>();//查询昨天一天的所有交易 OrdersDO o1 = new OrdersDO(); o1.setAppId(1L); o1.setTradeAmount(100L); o1.setStatus(1); list.add(o1); OrdersDO o2 = new OrdersD

Storm笔记整理(四):Storm核心概念与验证——并行度与流式分组

[TOC] Storm核心概念之并行度 Work 1个worker进程执行的是1个topology的子集(注:不会出现1个worker为多个topology服务).1个worker进程会启动1个或多个executor线程来执行1个topology的(spout或bolt).因此,1个运行中的topology就是由集群中多台(可能是一台)物理机上的一个或者多个worker进程组成的. Executor executor是worker进程启动的一个单独线程. 每个executor只会运行1个topo

流处理

流处理 1.1简介 流处理是针对流式数据的实时计算.它具有实时持续.来源众多.不关注存储等特点.典型的应用场景有互联网业务的日志数据处理.金融领域的银行股票数据处理等. 1.2    处理流程 传统数据处理流程是用户发起查询请求,请求被翻译成数据库查询语句,最终通过数据户将查询结果返回给用户.此时用户是主动的,DBMS是被动的 流处理数据处理流程是数据实时采集.实时计算.实时接受查询服务.用户接收流处理后的结果.此时用户是被动的,DBMS是主动的. 传统数据处理流程 流处理数据处理流程 2.流处

关于ES、PES、PS以及TS码流

一.基本概念 1)ES   ES--Elementary  Streams  (原始流)是直接从编码器出来的数据流,可以是编码过的视频数据流(H.264,MJPEG等),音频数据流(AAC),或其他编码数据流的统称.ES流经过PES打包器之后,被转换成PES包. ES是只包含一种内容的数据流,如只含视频或只含音频等,打包之后的PES也是只含一种性质的ES,如只含视频ES的PES,只含音频ES的PES等.每个ES都由若干个存取单元(AU)组成,每个视频AU或音频AU都是由头部和编码数据两部分组成,

【.NET Core项目实战-统一认证平台】第七章 网关篇-自定义客户端限流

[.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章我介绍了如何在网关上增加自定义客户端授权功能,从设计到编码实现,一步一步详细讲解,相信大家也掌握了自定义中间件的开发技巧了,本篇我们将介绍如何实现自定义客户端的限流功能,来进一步完善网关的基础功能. .netcore项目实战交流群(637326624),有兴趣的朋友可以在群里交流讨论. 一.功能描述 限流就是为了保证网关在高并发或瞬时并发时,在服务能承受范围内,牺牲部分请求为代价,保证系统的整体可用性而做的安全策略,避免单个服务

storm 的分组策略深入理解(-)

目录 storm的分组策略 根据实例来分析分组策略 common配置: Shuffle grouping shuffle grouping的实例代码 ShuffleGrouping 样例分析 Fields grouping Fields grouping 的实例 FieldGrouping 样例分析 storm的分组策略 洗牌分组(Shuffle grouping): 随机分配元组到Bolt的某个任务上,这样保证同一个Bolt的每个任务都能够得到相同数量的元组. 字段分组(Fields grou