storm原理

MapReduce,Hadoop及其相关技术以难以想象的程度来进行大规模存储和处理,可是这些处理技术不够实时,Hadoop 系统也没法变成一个实时系统,由于实时数据处理系统需求是彻底不一样于批处理系统的。 可是业务需求却须要大规模实时数据处理,因此 Hadoop 就成为了数据处理生态系统中最大的一个短板。而Storm就弥补了这一不足。之前是人工创建网络队列和 worker 实时处理过程,因此存在严重的不足,好比数据队列冗长、系统易崩溃,也不适合大规模处理。如今 Storm极大地扩充了用例集、规模化、容错、数据不丢失等等特性,处理速度是很是快的。 Nimbus 是经过 zookeeper 来传递信息的,也就是 zookeeper 在 nimbus 和 worker 之间创建了协调关系,因此对于 Strom 来讲,zookeeper 相当重要。java

早在 storm.yaml 配置中,咱们定义supervisor.slots.ports: 有4个端口,这就是 worker 的工做端口,一个 supervisor 有4个 worker 端口。 节点有两个: master 节点、 worker 节点。master节点运行 Nimbus服务,worker 节点运行 Supervisor服务。 Nimbus 的做用:负责集群上的代码分配; 机器上的任务分配;监控失效数据 Supervisor 的做用:监听分配的工做;启动、中止worker进程。每个 worker 进程就是运行一个 topology 的子集;一个 正在运行的topology分布在集群上每一个机器上运行的如图2所示。正在运行的topology你能够经过 UI web端查看到。 2、Topology 拓扑 Topology是 Storm中很重要的概念,这是处理实时计算的核心概念。一个 Topology就是一个计算的拓扑图,就是计算的路径和节点构成,并且这个图仍是封闭的哟!不会自动计算完毕的,你得使用 Storm kill 来杀掉这个执行的Topology。Topology就包含了处理逻辑,节点间的链接,也就是节点间的数据是怎么传递的。 这个是运行的Topology: $ storm jar storm-starter-1.1.0.jar org.apache.storm.starter.ExclamationTopology ExclamationTopology 3、Streams 数据流 Storm 中核心抽象概念就是 Stream, 数据流就是大量的一系列的tuples(元组)。Storm 用基元(primitives)以一种分布式的、可靠的方式将一个数据流转换成一个新的数据流。 好比,将一个微博数据流变换一个热门话题数据流。 Storm 中提供的数据流转换基元就是 spout 和 bolt。spout 和 bolt 提供了对应的接口,实现这个接口就能够运行特定应用的逻辑。 一个 spout就是一个数据流的源,例如,能够从 Kestrel(storm-kestrel 开源)队列中弹出的元组做为一个 spout,并能够将它们做为一个数据流。还有一个 spout能够调用 Twitter API 获得一个微博数据流。下面的一个图就代表了从一个源头取tuple元组造成一个 spout !就是从外部数据源(队列、数据库等)中读取数据,封装成元组,造成数据流。web

bolt 是用来处理数据里的,能够对一些数据流(不仅一个数据流)进行处理,可能会产生新的数据流。对一些复杂的数据流变换,好比从一个微博流中计算一个热门话题流,就须要不少步骤,所以就有多个 bolt。所以 bolt 中就有不少处理,好比运行函数,作流式聚合,流式连接,访问数据库等等。bolts 就以下图所示。数据库

从以上能够看出, spout 是一个 stream 的源, 而 bolt 倒是处理输入的 streams,来产生新的 streams。注意,spout 和 bolt 只不过是流发生器而已。 spout 和 bolt组成的网络就是拓扑图Topology,以下图所示。Topology就是最高层的逻辑抽象,能够直接送到 Storm 集群去执行。一个Topology图就是流式转换,每一个节点是 spout 或者 bolt。图中的每条边就是 bolt 订阅了流,当一个 spout或者 bolt 产生一个元组到一个流时,它就发送元组到订阅了流的每一个 bolt。apache

topology里面的每个节点都是并行运行的。能够指定每一个节点的并行度, storm则会在集群里面分配大量的线程计算。 一个topology会一直运行,直到你kill 掉它。storm能自动从新分配一些运行失败的任务, 而且storm保证不会有数据丢失, 即便一些机器意外停机而且消息被丢掉的状况下。 4、数据模型 storm使用元组tuple来做为它的数据模型。每一个tuple是一堆值,每一个值有一个名字,而且每一个值能够是任何类型, 在个人理解里面一个tuple能够看做一个没有方法的java对象。整体来看,storm支持全部的基本类型、字符串以及字节数组做为tuple的值类型。你也可使用你本身定义的类型来做为值类型, 只要你实现对应的序列化器(serializer)。 一个Tuple表明数据流中的一个基本的处理单元,例如一条cookie日志,它能够包含多个Field,每一个Field表示一个属性。数组

Tuple原本应该是一个Key-Value的Map,因为各个组件间传递的tuple的字段名称已经事先定义好了,因此Tuple只须要按序填入各个Value,因此就是一个Value List。 一个没有边界的、源源不断的、连续的Tuple序列就组成了Stream。cookie

topology里面的每一个节点必须定义它要产生的tuple的每一个字段。 好比下面这个bolt定义它所产生的tuple包含两个字段,类型分别是: double和triple。网络

public class DoubleAndTripleBolt extends BaseRichBolt { private OutputCollectorBase _collector;分布式

[@Override](https://my.oschina.net/u/1162528)
public void prepare(Map conf, TopologyContext context, OutputCollectorBase collector) {
    _collector = collector;
}

[@Override](https://my.oschina.net/u/1162528)
public void execute(Tuple input) {
    int val = input.getInteger(0);        
    _collector.emit(input, new Values(val*2, val*3));
    _collector.ack(input);
}

[@Override](https://my.oschina.net/u/1162528)
public void declareOutputFields(OutputFieldsDeclarer declarer) {
    declarer.declare(new Fields("double", "triple"));
}

} declareOutputFields方法定义要输出的字段 : ["double", "triple"]。这个bolt的其它部分咱们接下来会解释。 以上参考http://www.javashuo.com/article/p-mjkurmao-eg.html Storm的examples文件夹下有不少案例,执行 集群模式和本地模式的执行方式是不一样的,看看如何执行。ide

相关文章
相关标签/搜索