一、概述
Storm是一个开源的分布式实时计算系统,可以简单、可靠的处理大量的数据流。
Storm有很多使用场景:如实时分析,在线机器学习,持续计算,分布式RPC,ETL等等。
Storm支持水平扩展,具有高容错性,保证每个消息都会得到处理,而且处理速度很快(在一个小集群中,每个结点每秒可以处理数以百万计的消息)。
Storm的部署和运维都很便捷,而且更为重要的是可以使用任意编程语言来开发应用。
二、组件
1、结构
storm结构称为topology(拓扑),由stream(数据流)、spout(数据流的生成者)、bolt(数据流运算者)组成。
下图为官网提供的模型:
不同于Hadoop中的job,Storm中的topology会一直运行下去,除非进程被杀死或取消部署。
2、Stream
Storm的核心数据结构是tuple(元组),本质上是包含了一个或多个键值对的列表。Stream是由无限个的tuple组成的序列。
3、spout
spout连接数据源,将数据转化为tuple,并将tuple作为数据流进行发射。开发一个spout的主要工作就是利用API编写代码从数据源消费数据流。
spout的数据源可以有很多种来源:
web或者移动程序的点击流、社交网络的信息、传感器收集到的数据、应用程序产生的日志信息。
spout通常只负责转换数据、发射数据,不会用于处理业务逻辑,防止与业务产生耦合,从而可以很方便的实现spout的复用。
4、bolt
bolt主要负责数据的运算。将接收到的数据实施运算后,选择性的输出一个或多个数据流。
一个bolt可以接收多个由spout或其他bolt发射的数据流,从而可以组建出复杂的数据转换和处理的网络拓扑结构。
bolt常见的典型功能:
过滤、连接、聚合、计算和数据库的读写。
三、入门案例
1、案例结构
案例:Word Count案例
语句Spout-->语句分隔Bolt-->单词计数Bolt-->上报Bolt。
2、代码实现
1.语句生成Spout
SentenceSpout
作为入门案例,可以直接从一个数组中不断读取语句,作为数据来源。
SentenceSpout不断读取语句将其作为数据来源,组装成单值tuple(键名sentence,键值为字符串格式的语句)向后发射。
{“sentence”:“i am so shuai!”}
代码:
/**
-
BaseRichSpout类是ISpout接口和IComponent接口的一个简便的实现。采用了适配器模式,对用不到的方法提供了默认实现。
*/
public class SentenceSpout extends BaseRichSpout {private SpoutOutputCollector collector = null;
private String[] sentencer = {
“i am so shuai”,
“do you look me”,
“you can see me”,
“i am so shuai”,
“do you bilive”
};
private int index = 0;/**
- ISpout接口中定义的方法 所有Spout组件在初始化时都会调用这个方法。 map 包含了Storm配置信息 context
- 提供了topology中的组件信息 collector 提供了发射tuple的方法
*/
@Override
public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
this.collector = collector;
}
/**
- 覆盖自BaseRichSpout中的方法 核心方法 Storm通过调用此方法向发射tuple
*/
@Override
public void nextTuple() {
this.collector.emit(new Values(sentencer[index]));
index = (index + 1 >= sentencer.length ? 0 : index + 1);
Utils.sleep(1000);
}
/**
- IComponent接口中定义的方法 所有的Storm组件(spout、bolt)都要实现此接口。
- 此方法告诉Storm当前组件会发射哪些数据流,每个数据流中的tuple中包含哪些字段。
*/
@Override