Storm流分组介绍
Storm流分组介绍
流分组是拓扑定义的一部分,每个Bolt指定应该接收哪个流作为输入。流分组定义了流/元组如何在Bolt的任务之间进行分发。在设计拓扑的时候需要定义数据如何在组件之间进行交换(流如何被Bolt消耗处理)。
一个流分组指定每个Bolt消耗哪个流。一个节点可以发出多个数据流,流分组允许我们有选择的接收流进行消耗处理。
Storm内置了7种流分组方式和一个自定义分组方式(由InputDeclarer接口定义)。InputDeclarer接口定义了不同的流分组方式。每当TopologyBuilder的setBolt方法被调用时就返回该对象,用于声明一个Bolt的输入流,以及这些流应
该如何分组。InputDeclarer接口的完整定义代码如下:
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);
//自定义分组,通过实现CustomStreamGrouping接口可以实现自定义的流分组
public T customGrouping(String componentId, CustomStreamGrouping grouping);
public T customGrouping(String componentId, String streamId, CustomStreamGrouping grouping);
public T grouping(GlobalStreamId id, Grouping grouping);
}
从InputDeclarer接口中可以看出,流分组的方式主要有fieldsGrouping(字段分组)、globalGrouping(全局分组)、shuffleGrouping(随机分组)、localOrShuffleGrouping(本地或随机分组)、noneGrouping(无分组)、
allGrouping(广播分组)、directGrouping(直接分组)、customGrouping(自定义分组)这8种不同的流分组方式。每个InputDeclarer实例可以有不止一个源,每个源可以使用不同的流分组方式来分组。
1、随机分组
随机分组(Shuffle Grouping)是最常用的流分组方式,它随机分发元组到Bolt上的任务,这样能保证每个任务得到相同数量的元组。随机分组执行原子操作,这是很重要的,例如数学运算。
2、字段分组
字段分组(Fields Grouping)是根据指定字段对流进行分组。例如在日志处理时通常会把Error、Warn等字段进行分组,具有相同Error、Warn的元组总是被分发到相同的任务;不同于前者的字段可能会被分发到不同的任务。
字段分组是实现流连接、关联以及大量其他的用例的基础。在实现上字段分组使用取模散列来实现。
3、广播分组
广播分组(All Grouping)失智流分组发送到所有的Bolt的任务中。
4、全局分组
全局分组(Global Grouping)是指全部流都发送到Bolt的同一个任务中,具体一点是发送给ID最小的任务。
5、无分组
无分组(None Grouping)的应用场景是不关心流如何分组时则可以使用这种分组方式。目前这种分组和随机分组是一样的效果,有一点不同的是Storm会把这个Bolt放到Bolt订阅者的同一个线程中执行。
6、直接分组
直接分组(Direct Grouping)是一种特殊的分组。这种方式的流分组一维这由元组的生产者决定元组的消费者的接收元组的任务。直接分组只能在已经声明为直接流(Direct Stream)的流中使用,并且元组必须使用
emitDirect方法来发射。Bolt通过TopologyContext对象或者OutputCollector类的emit方法的返回值可以获取到其消费者的任务ID列表(List<Integer>)。
7、本地或随机分组
如果目标Bolt在同一工作进程存在一个或多个任务,元组会随机分配给这些任务。否则该分组方式与随机分组方式是一样的效果。
8、自定义分组
自定义分组(Custome Grouping),通过实现CustomStreamGrouping接口可以实现自定义的流分组,接口定义如下:
public interface CustomStreamGrouping extends Serializable {
void prepare(WorkerTopologyContext context, GlobalStreamId stream, List<Integer> targetTasks);
List<Integer> chooseTasks(int taskId, List<Object> values);
}
Storm流分组介绍的更多相关文章
- Storm Grouping —— 流分组策略
Storm Grouping: Shuffle Grouping :随机分组,尽量均匀分布到下游Bolt中 将流分组定义为混排.这种混排分组意味着来自Spout的输入将混排,或随机分发给此Bolt中的 ...
- 简单聊聊Storm的流分组策略
简单聊聊Storm的流分组策略 首先我要强调的是,Storm的分组策略对结果有着直接的影响,不同的分组的结果一定是不一样的.其次,不同的分组策略对资源的利用也是有着非常大的不同,本文主要讲一讲loca ...
- storm 入门原理介绍
1.hadoop有master与slave,Storm与之对应的节点是什么? 2.Storm控制节点上面运行一个后台程序被称之为什么? 3.Supervisor的作用是什么? 4.Topology与W ...
- (转发)storm 入门原理介绍
1.hadoop有master与slave,Storm与之对应的节点是什么? 2.Storm控制节点上面运行一个后台程序被称之为什么?3.Supervisor的作用是什么?4.Topology与Wor ...
- storm 入门原理介绍_AboutYUN
转自:http://www.aboutyun.com/thread-7394-1-1.html 了解Storm:http://www.aboutyun.com/thread-9547-1-2.html ...
- storm入门原理介绍
转自:http://www.cnblogs.com/wuxiang/p/5629138.html 1.hadoop有master与slave,Storm与之对应的节点是什么?2.Storm控制节点上面 ...
- storm group 的介绍与使用
一.stream group分组介绍 Stream 的分组分为随机分组.字段分组.全部分组.全局分组.无分组.直接分组,自定义分组 二.group的介绍 1.Shuffle grouping:通过tu ...
- 大数据开发实战:Storm流计算开发
Storm是一个分布式.高容错.高可靠性的实时计算系统,它对于实时计算的意义相当于Hadoop对于批处理的意义.Hadoop提供了Map和Reduce原语.同样,Storm也对数据的实时处理提供了简单 ...
- storm 的分组策略深入理解(-)
目录 storm的分组策略 根据实例来分析分组策略 common配置: Shuffle grouping shuffle grouping的实例代码 ShuffleGrouping 样例分析 Fiel ...
随机推荐
- java 类加载过程
1. 使用命令行查看类加载过程,在eclipse测试类的run configuration中配置-verbose:class或者-verbose,如下图所示: 运行结果如下所示: [Opened D: ...
- Configuring the JA-SIG CAS Client --官方
1. for Java using Spring Configuration of the CAS Client for Java via Spring IoC will depend heavily ...
- ubuntu下mysql中文乱码问题
本来就是想弄个网页往数据库里添加数据的,然后就发现了mysql的中文乱码问题,弄了半天解决方法如下: 首先停mysql服务,编辑配置文件my.cnf $ sudo stop mysql $sudo v ...
- Java基础知识强化84:System类之exit()方法和currentTimeMillis()方法
1. exit方法: public static void exit(int status): 终止当前正在运行的Java虚拟机.参数用作状态码:根据惯例,非0的状态码表示异常终止. 调用System ...
- NYOJ-129 并查集
这个题基本上是并查集稍微一变, 只是加了一些判断条件而已,就是将点合并成树, 最后遍历一下, 统计一下有多少棵树, 如果不是1的话, 肯定不是树,所以,可以根据这个来判断 #include <s ...
- web第一节课 sql 数据库连接 查询
1.数据库连接语句 <connectionStrings> <add name="yhotel" connectionString="Database= ...
- SQL Server 和CLR集成
通过在 Microsoft SQL Server 中托管 CLR(称为 CLR 集成),可以在托管代码中编写存储过程.触发器.用户定义函数.用户定义类型和用户定义聚合函数. 因为托管代码在执行之前会编 ...
- GitHub——如何更新已经fork的代码
github上有个很方便的功能叫fork,将别人的工程一键复制到自己账号下.这个功能很方便,但有点不足的是,当源项目更新后,你fork的分支并不会一起更新,需要自己手动去更新.下面记录下网上找到的更新 ...
- php resizeimage 部分jpg文件 生成缩略图失败
今天遇到GD的resizeimage 函数处理jpg后缀文件的缩略图的时候 提示该图片不是合法的jpg图片并报错 <b>Warning</b>: imagecreatefrom ...
- PHPCMSv9 更改后台地址(测试)
最新发布的PHPCMS V9由于采用了MVC的设计模式,所以它的后台访问地址是固定的,虽然可以通过修改路由配置文件来实现修改,但每次都修改路由配置文件对于我来说有点麻烦了,而且一不小心就会出错.这里使 ...