前言:html
Storm读取实时数据流,并传递给处理单元,最终输出处理后的数据。
下图描述了storm的处理数据的主要结构。数据库
元组(Tuple) :
元组是Storm提供的一个轻量级的数据格式,能够用来包装你须要实际处理的数据。元组是一次消息传递的基本单元。一个元组是一个命名的值列表,其中的每一个值均可以是任意类型的。元组是动态地进行类型转化的(字段的类型不须要事先声明)。在Storm中编程时,就是在操做和转换由元组组成的流。一般,元组包含整数,字节,字符串,浮点数,布尔值和字节数组等类型。要想在元组中使用自定义类型,就须要实现本身的序列化方式。编程
流(Stream) :
一个流由无限的元组序列组成,这些元组会被分布式并行地建立和处理。经过流中元组包含的字段名称来定义这个流。
每一个流声明时都被赋予了一个ID。只有一个流的Spout和Bolt很是常见,因此OutputFieldsDeclarer提供了不须要指定ID来声明一个流的函数(Spout和Bolt都须要声明输出的流)。这种状况下,流的ID是默认的“default”。数组
Spouts :
Spout(喷嘴)是Storm中流的来源。一般Spout从外部数据源,如消息队列中读取元组数据并吐到拓扑里。Spout能够是可靠的(reliable)或者不可靠(unreliable)的。可靠的Spout可以在一个元组被Storm处理失败时从新进行处理,而非可靠的Spout只是吐数据到拓扑里,不关心处理成功仍是失败了。架构
Spout能够一次给多个流吐数据。此时须要经过OutputFieldsDeclarer的declareStream函数来声明多个流并在调用SpoutOutputCollector提供的emit方法时指定元组吐给哪一个流。负载均衡
Spout中最主要的函数是nextTuple,Storm框架会不断调用它去作元组的轮询。若是没有新的元组过来,就直接返回,不然把新元组吐到拓扑里。nextTuple必须是非阻塞的,由于Storm在同一个线程里执行Spout的函数。框架
Spout中另外两个主要的函数是ack和fail。当Storm检测到一个从Spout吐出的元组在拓扑中成功处理完时调用ack,没有成功处理完时调用fail。只有可靠型的Spout会调用ack和fail函数。分布式
Bolts :
storm是一种分布式实时计算系统,而storm topology中,全部的实时计算的业务逻辑都是定义在bolt中的。bolt中能够作任何计算逻辑,好比过滤、执行自定义的函数、聚合、join、访问数据库,等等。简而言之,bolt实际上就是咱们实现或者继承了storm提供的接口或基类,本身开发的类。函数
接着看一个实例,如何经过Apache Storm来构建Twitter Analysis。结构以下图所示。大数据
经过Twitter Streaming API为Twitter Analysis提供输入数据。Spout经过Twitter Streaming API读取数据,并以tuple流的形式输出。随后tuple将转发给bolt,bolt将会对tuple进行处理。
Topology(拓扑):
storm topology和mapreduce job是有些相似的。惟一关键的区别就在于,mapreduce job是确定会结束运行的;可是storm topology是永远会运行的,除非你本身手动杀了它。
使用storm开发的实时计算应用程序,全部的计算逻辑都在topology中。一个topology,其实就是逻辑上的计算流向图,由spout和bolt组成。一个topology能够包含一个或者多个spout和bolt。而spout和bolt,就是topology这个计算流向图种的一个一个的计算节点,其中包含了咱们本身编写的计算代码。spout和bolt之间的关系和联系,其实就定义了实时计算的数据流向。能够想象成,数据从外部读入spout,而后传输到后面一个一个的bolt;而bolt之间的数据流向,多是交叉层叠的,看起来整个topology就像一个DAG(有向无环图)同样。 简而言之,topology,就是逻辑上的实时计算拓扑图。
Tasks(任务):
Spout 和 bolt是topology中的最小逻辑单元。topology是经过一个spout和一组bolt构建。逻辑单元须要按特定的顺序来执行。Storm所执行的每一个spout和bolt称为task。简而言之,spout或bolt的执行称为task。每一个spout和bolt均可以有多个不一样的实例运行在不一样的线程中。(每个task对应到一个线程)。
Workers:
toplogy是在分布式环境下,多个worker节点上运行。storm将任务均匀分配在全部worker节点上。work节点的做用是监放任务(jobs),当有新任务来时,启动或中止任务的处理。每一个worker是一个物理JVM而且执行整个topology的一部分。
Stream Grouping:
流分组,是拓扑定义中的一部分,为每一个bolt指定应该接收哪一个流做为输入。流分组定义流/元组如何在bolt的任务之间进行分发。
感谢您阅读上海大数据培训文章,
更多推荐阅读:
【上海大数据培训】storm集群架构;
【上海大数据培训】storm如何分配任务和负载均衡