文档章节

Storm组件介绍

九劫散仙
 九劫散仙
发布于 2016/08/12 20:29
字数 1464
阅读 105
收藏 2
(1)Topologies 拓扑

解释:
拓扑类似一个集装箱,所有的货物都会存储在集装箱里面最后被托运走,storm里面所有的代码和文件最终会被打包在一个拓扑中,然后提交在storm集群中运行,类似于Hadoop中的一个MapReduce的作业,最大的区别在于MapReduce最终会主动停止,Storm的Topologies不会主动停止,除非你强制kill掉它

相关拓展:

TopologyBuilder : Java里面构造Topology工具类

生产模式
Config conf = new Config();
conf.setNumWorkers(20);
conf.setMaxSpoutPending(5000);
StormSubmitter.submitTopology("mytopology", conf, topology);
本地模式
import org.apache.storm.LocalCluster;
LocalCluster cluster = new LocalCluster();

(2)Streams 数据流

Stream是Storm里面的核心抽象模型,在分布式环境下一个数据流是由无限的tuple序列组成,这些通过数据源并行的源源不断的被创建出来,Stream的schema是由一个字段名标识,值类型可以是integer,long,shot,bytes,string,double,float,boolean,byte array当然我们可以自定义序列化类型。

每个流在声明时会被指定一唯一标识id,如果输出的流只有一个可以不用标识,默认指定的id是default


OutputFieldsDeclarer类负责输出标识
单个流声明:
declarer.declare(new Fields("single")
多个流声明:
declarer.declareStream("a", new Fields("data", "time", "countyId")
declarer.declareStream("b", new Fields("data", "time", "countyId")
declarer.declareStream("c", new Fields("data", "time", "countyId")

相关拓展:
Tuple:streams由一系列tuple组成
OutputFieldsDeclarer:用于声明流和他们的schema
Serialization:动态tuple类型和声明自定义序列化

(3)Spouts (喷嘴比喻数据源)

一个spout是由流组成的数据源在storm的拓扑里,通常情况下会读取外部的数据源
然后emit(发射)到拓扑里面,比如是kafka,MySQL或者redis等等,Spout有两种实现一种是可靠的消息实现,如果发送失败则会重试,另外一种是不可靠的消息实现可能会出现消息丢失,spout可以一次声明多个数据流通过OutputFieldsDeclarer类的declareStream方法,当然前提是你的SpoutOutputCollector里的emit也是多个流

Spout里面主要的方法是nextTuple,它里面可以发射新的tuple到拓扑,或者当没有消息的时候就return,需要注意,这个方法里面不能阻塞,因为storm调用spout方法是单线程的,其他的主要方法是ack和fail,如果使用了可靠的spout,可以使用ack和fail来确定消息发送状态

相关扩展:
IRichSpout:spout类必须实现的接口
BaseRichBolt :可靠的spout有ack确保
BaseBasicBolt :不可靠的spout

(4)Bolts 业务处理单元
所有的拓扑处理都会在bolt中进行,bolt里面可以做任何etl,比如过滤,函数,聚合,连接,写入数据库系统或缓存等,一个bolt可以做简单的事件流转换,如果是复杂的流转化,往往需要多个bolt参与,这就是流计算,每个bolt都进行一个业务逻辑处理,bolt也可以emit多个流到下游,通过declareStream方法声明输出的schema。

Bolt里面主要的方法是execute方法,每次处理一个输入的tuple,bolt里面也可以发射新的tuple使用OutputCollector类,bolt里面每处理一个tuple必须调用ack方法以便于storm知道某个tuple何时处理完成。Strom里面的IBasicBolt接口可以自动
调用ack。

相关拓展:
IRichBolt:bolts的通用接口
IBasicBolt:扩展的bolt接口,可以自动处理ack
OutputCollector:bolt发射tuple到下游bolt里面


(5)Stream grouping 流分组

分组定义了那个bolt可以收到上游的数据流,流分组定义了stream应该怎样在所有的bolt task中进行分区


目前storm内置8中分组接口可以满足大多数应用开发,你也可以通过 CustomStreamGrouping来自定义分组接口

(5.1)Shuffle grouping 随机的分发数据流,保证每个bolt可以得到相等数量的tuple

(5.2)Fields grouping
在grouping中stream通过字段进行分区分发,比如按照userid分组,那么storm能保证在同一个task中收到的userid是一样的,但是在不同的task中,他们的userid也是不一样的

(5.3)Partial Key grouping
同Fields grouping类似,但是这个流分组能在数据有倾斜的情况下做负载均衡

(5.4)All grouping
所有的bolt task都会收到此分组下的消息

(5.5)Global grouping
所有的stream都会发射到多个bolt task中的其中一个

(5.6)None grouping
等同于Shuffle grouping

(5.7)Direct grouping
由生产者控制把tuple直接发送到那个消费者的bolt中,需要在代码里面控制

(5.8)Local or shuffle grouping 

如果目标bolt有一个或多个task,在一个worker工作进程中,tuple仅仅会分发
到在同一个进程的task中,分发方式类似shuffle grouping

扩展:
TopologyBuilder:使用这个类定义拓扑
InputDeclarer: 声明那些声明的流可以被指定的bolt接受

(6)Reliability 可靠性

使用ack保证,消息可以超时和重试

(7)Tasks 任务
每个spout和bolt会执行多个task横跨整个集群,每个task会在一个线程中执行
stream grouping定义了每个task送到到那个下游的task中,在使用TopologyBuilder时,可通过setSpout 和 setBolt方法进行设置

(8)Workers 工作者
Topologies执行会横跨在一个或多个worker上,每个worker是一个独立的jvm,会执行所有task里面的其中一部分task,比如一个拓扑的并行度是300并且有50个worker,那么每个worker上会执行6个task(6个线程在worker内部),storm会确保
所有的task尽量均衡的分布在所有worker中。

相关扩展:
设置worker数
conf..setNumWorkers(workNums);

© 著作权归作者所有

共有 人打赏支持
九劫散仙
粉丝 263
博文 175
码字总数 189625
作品 0
海淀
Twitter Storm集群搭建小结

最近自己尝试搭建了一下Twitter Storm的集群,参考了很多网友的博客,特别是徐明明的;这里只对自己搭建时的过程和所遇到的问题做一个小总结,方便查阅。 Storm是Twitter开源的一个实时计算框...

Breath_L
2012/10/21
0
4
大数据处理 Hadoop、HBase、ElasticSearch、Storm、Kafka、Spark

场景 伴随着信息科技日新月异的发展,信息呈现出爆发式的膨胀,人们获取信息的途径也更加多样、更加便捷,同时对于信息的时效性要求也越来越高。举个搜索场景中的例子,当一个卖家发布了一条...

江河海流
2014/03/30
0
0
Storm概念讲解和工作原理介绍

Strom的结构 Storm与传统关系型数据库 传统关系型数据库是先存后计算,而storm则是先算后存,甚至不存 传统关系型数据库很难部署实时计算,只能部署定时任务统计分析窗口数据 关系型数据库重...

张超
2015/04/26
0
0
storm 原理简介及单机版安装指南(转)

本文翻译自: https://github.com/nathanmarz/storm/wiki/Tutorial Storm是一个分布式的、高容错的实时计算系统。 Storm对于实时计算的的意义相当于Hadoop对于批处理的意义。Hadoop为我们提供...

Jacos
2014/12/03
0
0
Storm简介(转载自淘宝,加了点个人理解)

伴随着信息科技日新月异的发展,信息呈现出爆发式的膨胀,人们获取信息的途径也更加多样、更加便捷,同时对于信息的时效性要求也越来越高。举个搜索场景中的例子,当一个卖家发布了一条宝贝信...

junanhonglei
2015/06/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

jquery创建类似于java的map

var map = {}; // Map map = new HashMap(); map[key] = value; // map.put(key, value); var value = map[key]; // Object value = map.get(key); var has = key in map; // boolean has = ......

SuperDabai
34分钟前
0
0
java大数据转换16进制转10进制

public static void main(String[] args) {String hex = "0xdbf3accc683297cf0000";BigInteger amount = new BigInteger(hex.substring(2), 16);System.out.println(amount);......

任梁荣
昨天
2
0
OSChina 周六乱弹 —— 目测我们程序员丁克的几率不大

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @真Skr小机灵鬼儿:8.13分享Jocelyn Pook/Russian Red的单曲《Loving Strangers》 《Loving Strangers》- Jocelyn Pook/Russian Red 手机党少...

小小编辑
昨天
9
3
TypeScript基础入门 - 函数 - 剩余参数

转载 TypeScript基础入门 - 函数 - 剩余参数 项目实践仓库 https://github.com/durban89/typescript_demo.gittag: 1.2.1 为了保证后面的学习演示需要安装下ts-node,这样后面的每个操作都能...

durban
昨天
1
0
OpenCV边缘检测算子原理总结及实现

1. 拉普拉斯算子 原理:是一种基于图像导数运算的高通线性滤波器。它通过二阶导数来度量图像函数的曲率。 拉普拉斯算子是最简单的各向同性微分算子,它具有旋转不变性。一个二维图像函数的拉...

漫步当下
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部