storm的数据源编程单元Spout学习整理

简介: Spout呢,是Topology中数据流的源头,也是Storm针对数据源的编程单元。一般数据的来源,是通过外部数据源来读取数据项(Tuple),并读取的数据项传输至作业的其他组件。编程人员一般可通过OutputFieldsDeclarer类的declareStream()方法来声明多个流,指定数据将要发送的流,然后使用SpoutOutputCollector的emit方法将数据发送。

Spout呢,是Topology中数据流的源头,也是Storm针对数据源的编程单元。一般数据的来源,是通过外部数据源来读取数据项(Tuple),并读取的数据项传输至作业的其他组件。编程人员一般可通过OutputFieldsDeclarer类的declareStream()方法来声明多个流,指定数据将要发送的流,然后使用SpoutOutputCollector的emit方法将数据发送。

这里整理了下ISpout和IComponent接口。

ISpout声明了Spout的核心方法,用于向Topology供给数据项。对于每一个发出的数据项,Storm通过Spout,可以追踪它经历处理过程的有向无环图(竟然也是DAG)。

void open (java,util.Map conf,TopologyContext context,SpoutOutputCollector collector)
用于实例化Spout的一个运行时任务,被急群众的某一进程调用 (conf对象维护Storm中针对该Spout的配置信息,context是一个上下文对象,可用于获取该组件运行时任务的信息,collector用于从该Spout发送数据项)

void close() 
用于停止一个Spout

void activate()
在Spout从非激活状态转换为激活状态时被调用

void deactivate()
在Spout的非激活状态被调用

void ack(java.lang.Object msgId)
Storm用于确认该Spout发送的这个数据项已经被完整处理
void fail(java.lang.Object msgId) Storm用于确认该Spout发送的这个数据项已经失败 void nextTuple() 当这个方法被调用时,Storm要求Spout发送一个数据项至output collector

(nextTuple是Spout向Topology中发送一个数据项,是Spout需要实现的最重要的方法。在可靠的Spout的一个任务中,nextTuple()、ack()、fail()三个方法的调用在一个单独线程中循环。当不存在数据项需要发送时,nextTuple()将会休眠一小段间隔,确保不会浪费过多的CPU资源)

 

IComponent接口,声明了Topology组件的通用方法。使用JAVA语言的Spout和Bolt都必须实现这个接口。

void declareOutputFields(OutputFieldsDeclarer declarer)
声明指定输出流的数据项结构。(这里指定了输出流的数据项结构(schema)。参数declarer被用来声明输出流(stream)的id,域。

java.util.Map  getComponentConfiguration()
获取组件的配置信息

 

以Storm官网的WordCount来说明就是:

public class WordCount extends BaseRichSpout
{
    public static Logger log = logger.getLogger(backtype/storm/testing/WordCount);

    boolean_isDistributed;
    SpoutOutputCollector_collector;
    
    public WordCount(){
        this(true);
    }
    
    public WordCount(boolean isDistributed){
        _isDistributed = isDistributed;
    }

    public void open(Map conf,TopologyContext context,SpoutOutputCollector collector){
    _collector = collector;
    }

    public void close(){
    }

    public void nextTuple(){
       Utils.sleep(100L);
        String words[] = {
        "nathan","mike","jackson","golda","bertels"
        };

    public void ack(Object obj){
    }

    public void fail(Object obj){
    }

    public void declareOutputFields(OutputFieldsDeclarer declarer){
        declarer.declarer(new Fields(new String[] {
            "word"
    }));
    }

    public Map getComponentConfiguration(){
        if(!_isDistributed_)
        {
            Map ret = new HashMap();
            ret.put(Config.TOPOLOGY_MAX_TASK_PARALLELISM,Integer.valueOf(1));
}else{
        return null;
        }
    }
}

1、类中有对WordCount的两个重载的构造函数,其中_isDistributed指明了Spout的并行度,若_isDistributed=false,则意味着这个Spout运行时仅有一份任务实例。

2、open()函数的实现,将传入的collector赋值给局部变量,使之后通过该局部变量来操作数据项的发送。

3、declareOutputFields()函数,生命了输出流的数据项结构。

4、nextTuple函数,让一只执行的线程休眠100毫秒,再继续执行下述函数体,通过线程的休眠,控制nextTuple()产生数据项的周期为0.1秒。并且在维护字符串数组中,随机挑选一个字符串,作为"word"的域,交给变量collector作为一个Tuple发送。 (ack的作用是确认数据项是否被完整处理,这里没做处理)

5、getComponentConfiguration()函数则返回组建的配置信息(这个实例中只有在_isDistributed=false时,才返回包含该配置项的Map数据结构。

6、其他重载函数都为空实现。

那么在Topology实现类的main函数使其作为一个spout:

TopologyBuilder builder = new TopologyBuilder();
    builder.setSpout("sentenceGenSpout",new WordCount());

 

目录
相关文章
|
7月前
|
SQL 算法 API
读Flink源码谈设计:图的抽象与分层
前阵子组里的小伙伴问我“为什么Flink从我们的代码到真正可执行的状态,要经过这么多个graph转换?这样做有什么好处嘛?”我早期看到这里的设计时的确有过相同的疑惑,当时由于手里还在看别的东西,查阅过一些资料后就翻页了。如今又碰到了这样的问题,不妨就在这篇文章中好好搞清楚。
562 0
读Flink源码谈设计:图的抽象与分层
|
7月前
|
存储 分布式计算 监控
Hadoop【基础知识 01+02】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
【4月更文挑战第3天】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
339 2
|
7月前
|
分布式计算 监控 Hadoop
Hadoop【基础知识 02】【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
【4月更文挑战第3天】Hadoop【基础知识 02】【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
324 0
|
7月前
|
消息中间件 存储 监控
深入剖析:Kafka流数据处理引擎的核心面试问题解析75问(5.7万字参考答案)
Kafka 是一款开源的分布式流处理平台,被广泛应用于构建实时数据管道、日志聚合、事件驱动的架构等场景。本文将深入探究 Kafka 的基本原理、特点以及其在实际应用中的价值和作用。 Kafka 的基本原理是建立在发布-订阅模式之上的。生产者将消息发布到主题(Topic)中,而消费者则可以订阅这些主题并处理其中的消息。Kafka包括多个关键组件,如生产者、消费者、主题分区、ZooKeeper 等,Kafka 实现了高性能的消息传递和存储。特点:高吞吐量、可持久化存储、水平扩展、容错性和实时性等。
274 0
|
7月前
|
传感器 JSON Java
流计算中的流式图处理是什么?请解释其作用和常用操作。
流计算中的流式图处理是什么?请解释其作用和常用操作。
72 0
|
7月前
|
消息中间件 分布式计算 Java
流计算与批处理的区别是什么?请举例说明。
流计算与批处理的区别是什么?请举例说明。
117 0
|
7月前
|
存储 传感器 数据挖掘
什么是流计算?请简要解释其概念和特点。
什么是流计算?请简要解释其概念和特点。
227 0
|
BI Apache 流计算
Apache Flink 概念介绍:有状态流式处理引擎的基石(二)| 学习笔记
快速学习 Apache Flink 概念介绍:有状态流式处理引擎的基石。
Apache Flink 概念介绍:有状态流式处理引擎的基石(二)| 学习笔记
|
大数据 数据处理 Apache
Apache Flink 概念介绍:有状态流式处理引擎的基石(一)| 学习笔记
快速学习 Apache Flink 概念介绍:有状态流式处理引擎的基石。
Apache Flink 概念介绍:有状态流式处理引擎的基石(一)| 学习笔记
|
Java 程序员 网络安全