开发者社区> 华章计算机> 正文

《Storm企业级应用:实战、运维和调优》——3.2 Spout数据源

简介:
+关注继续查看

本节书摘来自华章计算机《Storm企业级应用:实战、运维和调优》一书中的第3章,第3.2节,作者:马延辉 陈书美 雷葆华著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.2 Spout数据源

消息源Spout是Storm的Topology中的消息生产者(即Tuple的创造者)。
3.2.1 Spout介绍
1.?Spout的结构
Spout是Storm的核心组件之一,最源头的接口是IComponent,如图3-2所示,几个Spout接口都继承自IComponent。

image

2.?Spout发出的消息
Spout从外部获取数据后,向Topology中发出的Tuple可以是可靠的,也可以是不可靠的。
一个可靠的消息源可以重新发射一个Tuple(如果该Tuple没有被Storm成功处理),但是一个不可靠的消息源Spout一旦发出,一个Tuple就把它彻底“遗忘”,也就不可能再发了。
3.?Spout发射的流
Spout可以发射多个流。要达到这样的效果,使用OutputFieldsDeclarer.declareStream来定义多个流(即定义多个Stream),然后使用SpoutOutputCollector来发射指定的流。
4.?Spout的重要方法
Spout的重要方法是nextTuple。nextTuple方法发射一个新的元组到Topology,如果没有新元组发射,则直接返回。注意任务Spout的nextTuple方法都不要实现成阻塞的,因为Storm是在相同的线程中调用Spout的方法。Spout的另外两个重要方法是ack和fail方法。当Spout发射的元组被拓扑成功处理时,调用ack方法;当处理失败时,调用fail方法。ack和fail方法仅被可靠的Spout调用。
5.?Spout的组件
Spout的最顶层抽象是ISpout接口。在通常情况下(Shell和事务型的除外),实现一个Spout,可以直接实现接口IRichSpout,如果不想写多余的代码,可以直接继承BaseRichSpout。
3.2.2 Spout实例
下面通过创建一个实例RandomSpout来介绍Spout,图3-3为RandomSpout继承自BasicRichSpout及其实现的原理图。
图3-4列出了实例RandomSpout继承自BaseRichSpout中的几个重要方法。
下面对图3-4中的方法进行详细介绍。
(1)open方法
当一个Task被初始化时会调用此open方法。一般都会在此方法中初始化发送Tuple的对象SpoutOutputCollector和配置对象TopologyContext。
代码示例如下:

public void open(Map conf, TopologyContext context,   SpoutOutputCollector collector) {
      this.collector = collector;
      random = new Random();   
}

image

(2)declareOutputFields方法
此方法用于声明当前Spout的Tuple发送流。流的定义是通过OutputFieldsDeclare.declareStream方法完成的,其中的参数包括了发送的域Fields。
示例代码如下:

public void declareOutputFields(OutputFieldsDeclarer declarer) {
      declarer.declare(new Fields("randomInt"));
}

(3)nextTuple方法
这是Spout类中最重要的一个方法。发射一个Tuple到Topology都是通过该方法来实现的。
示例代码如下:

public void nextTuple() {
      while(true){
          Values val = new Values(random.nextInt(100));
          collector.emit(val);
          try {
              Thread.sleep(500);
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
      }      
  }

以上代码从100以内的整数中随机生成一个数作为Tuple的值,然后通过_collector发送到Topology。
另外,除了上述几个方法之外,还有getComponentConf?iguration、ack、fail和close方法等。getComponentConf?iguration方法用于配置当前组件的参数,Storm监测到一个Tuple被成功处理时调用ack方法,处理失败时调用fail方法,这两个方法在BaseRichSpout类中已经被隐式-实现了。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
全新一代企业级大数据应用模式揭秘
三个问题 1.当下是否还需要一个复杂的EDW(企业级数据仓库)? 2.数据系统的目标用户是谁? 3.让数据适应计算能力还是计算跟着数据走 数据仓库这个概念在二十多年前由Bill Inmon提出后,几乎所有的IT厂商都开始介入这个领域,为企业级数据仓库设计非常复杂的体系结构和数据模型,典型的企业级数据应用架构如下: 这个架构,层次结构非常清晰,但是链路非常长,导致数据冗余非常大,同时数据表结构关系复杂,是一个典型的给技术人员使用的模型,业务的同学要使用数据是非常难的,没法理解底层复杂的表结构和表之间复杂的关联关系。
874 0
《数据挖掘:实用案例分析》——1.2 数据挖掘在企业商务智能应用中的定位
本节书摘来自华章计算机《数据挖掘:实用案例分析》一书中的第1章,第1.2节,作者 张良均 陈俊德 刘名军 陈荣,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1413 0
10059
文章
0
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载