storm入门

stom适合处理流式数据,类似于sparkStreaming

stom运行流程:
网络数据-> Spout-> bolts1-> bolts2->…->运行结束

**NOTE:**一个spout发布一个定义域列表。这个架构允许你使用不同的bolts从同一个spout流读取数据,它们的输出也可作为其它bolts的定义域,以此类推。

Tuple

Tuple是Storm的主要数据结构
Storm中的Tuple与python中的tuple类似,其可以是任意长度的,只读的,每一个元素的数据类型都可以不一样
其数据结构如下图
在这里插入图片描述

生命周期

下段java代码展示了Spout(消息源)接口发出Tuple(消息)的整个过程,源码如下
public interface ISpout extends Serializable{ void open(Map conf,TopologyContext context,SpoutOutputCollector collector); void nextTuple(); void ack(Object msgId); void fail(Object msgId); void close(); }
首先,Storm调用Spout的nextTuple方法来获取下一个Tuple,Spout通过Open方法的参数提供的SpoutOutputCollector将新Tuple发射到其中一个输出消息流。发射Tuple时,Spout提供一个message-id,通过这个ID来追踪该Tuple。然后,Storm跟踪该Tuple的树形结构是否成功创建,从根据message-id调用Spout中的ack函数,以确认Tuple是否被完全处理。如果Tuple超时,则调用Spout的fail方法。
由此看出,同一个Tuple不管是acked还是failed都是由创建它的Spout发出并维护的,所以Storm会利用内部的Acker机制保证每个Tuple被可靠地处理(类似TCP的确认机制)。最后,在任务完成后,Spout调用Close方法结束Tuple的使命。

spout

Spout是Storm的Topology中的消息生产者(Tuple的创造者)

该类实现了IRichSpout接口

第一个被调用的spout方法都是public void open(Map conf, TopologyContext context, SpoutOutputCollector collector)
它接收如下参数:配置对象,在定义topology对象时创建;TopologyContext对象,包含所有拓扑数据;还有SpoutOutputCollector对象,它能让我们发布交给bolts处理的数据。

接下来我们要实现public void nextTuple(),spout就是通过这个方法接收输入stom集群的数据(接收网络流)。

Spout从外部获取数据后,向Topology中发出的Tuple可以是可靠的,也可以是不可靠的。一个可靠的消息源可以重新发射一个Tuple(如果该Tuple没有被Storm成功处理),但是一个不可靠的消息源,Spout一旦发出一个Tuple就把它彻底“遗忘”,也就不可能再发了。(类似UDP/TCP)

Spout可以发射多个流。要达到这样的效果,使用OutputFieldsDeclarer.declareStream来定义多个流(定义多个Stream),然后使用SpoutOutputCollector来发射指定的流。

Spout的最顶层抽象是ISpout接口,在通常情况下(Shell和事务型的除外),实现一个Spout,可以直接实现接口IRichSpout,如果不想写多余代码,可以直接继承BaseRichSpout。

注意:任务Spout的nextTuple方法都不要实现成阻塞的,因为Storm是在相同的线程中调用Spout的方法。

ack和fail方法仅可被可靠的Spout调用。

Bolt

Bolt是消息处理者,在Storm中是一个被动的角色,它把Tuple作为输入,然后产生新的Tuple作为输出。Bolt可以执行过滤、函数操作、合并、写数据库等操作(还可以简单地传递消息流,复杂的消息流往往需要很多步骤,因此需要很多Bolt来处理)。

生命周期

先,客户端创建Bolt,然后将其序列化为拓扑,并提交给集群中的主机。

之后,集群启动Worker进程,反序列化Bolt,调用prepare方法开始处理元组。

接下来,Bolt处理Tuple,Bolt处理一个输入Tuple,发射0个或者多个Tuple,然后调用ack通知Storm自己已经处理过这个Tuple了(Storm提供了一个IBasicBolt自动调用ack)。Bolt类接收由Spout或者其他上游Bolt类发来的Tuple,对其进行处理。
在这里插入图片描述
在创建Bolt对象时,通过构造方法初始化成员变量,当Bolt被提交到集群时,这些成员变量也会被序列化,所以通过反序列化,可以获取到这些成员变量。

Bolt同样可以直接继承BaseRichBolt
Bolt的主要方法是execute(Tuple input),它以一个Tuple作为输入
Bolt使用OutputCollector对象来发射Tuple,Bolt必须为它处理的每一个Tuple调用OutputCollector的ack方法,以通知Storm该Tuple被处理完成了,从而通知该Tuple的发射者Spout

Topology

torm的Topology是指类似于网络拓扑图的一种虚拟结构。Storm拓扑类似于MapReduce任务,一个关键的区别是MapReduce任务运行一段时间后最终会完成,而Storm拓扑一直运行(直到杀死它)

可以在主类中创建拓扑和一个本地集群对象,以便于在本地测试和调试

NOTE:所有拓扑节点的各个进程必须能够独立运行,而不依赖共享数据(也就是没有全局变量或类变量),因为当拓扑运行在真实的集群环境时,这些进程可能会运行在不同的机器上。

TopologyBuilder将用来创建拓扑,它决定Storm如何安排各节点,以及它们交换数据的方式

	//定义拓扑
	TopologyBuilder builder = new TopologyBuilder();
    builder.setSpout("word-reader", new WordReader());
    builder.setBolt("word-normalizer", new WordNormalizer()).shuffleGrouping("word-reader");
    builder.setBolt("word-counter", new WordCounter()).shuffleGrouping("word-normalizer");
在spout和bolts之间通过shuffleGrouping方法连接。这种分组方式决定了Storm会以随机分配方式从源节点向目标节点发送消息。
	//配置需要传递给主节点的信息,并定为Debug模式
	Config conf = new Config();
    conf.put("wordsFile", "./我的文件.txt");
    conf.setDebug(true);

	// 创建并提交拓扑,运行2s后关闭
	LocalCluster cluster = new LocalCluster();
    cluster.submitTopology("Getting-Started-Topologie", conf, builder.createTopology());
    Thread.sleep(2000);
    cluster.shutdown();
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值