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()
用于停止一个Spoutvoid 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());

转载于:https://www.cnblogs.com/yangsy0915/p/5125906.html

storm的数据源编程单元Spout学习整理相关推荐

  1. Storm架构和编程模型总结

    1. 编程模型 DataSource:外部数据源 Spout:接受外部数据源的组件,将外部数据源转化成Storm内部的数据,以Tuple为基本的传输单元下发给Bolt Bolt:接受Spout发送的数 ...

  2. Python GUI编程-了解相关技术[整理]

    Python GUI编程-了解相关技术[整理] 我们可以看到,其实python进行GUI开发并没有自身的相关库,而是借用第三方库进行开发.tkinter是tcl/tk相关,pyGTK是Gtk相关,wx ...

  3. Java设计模式(学习整理)---命令模式

    设计模式之Command(学习整理) 1.Command定义 不少Command模式的代码都是针对图形界面的,它实际就是菜单命令,我们在一个下拉菜单选择一个命令时,然后会执行一些动作. 将这些命令封装 ...

  4. ACM竞赛学习整理开篇之01背包问题

    ACM竞赛学习整理开篇之01背包问题. 最近,偶然的一次机会让我关注信息奥赛的一些内容.发现其中的内容很有趣,是学习编程的一条很好的路径,又能很好地将数学和编程联系到一起.在csdn里看到了不少同好也 ...

  5. Vue-Cli 学习整理【转载】

    Vue-Cli 学习整理 坚果 程序猿/艺术 ​关注他 21 人赞同了该文章 1. vue-cli(vue脚手架)全集 1.1. vue-cli2脚手架 1.1.1. nodejs/npm环境安装 1 ...

  6. Spring Boot 2.0 多数据源编程 jdbcUrl is required with driverClassName

    转载:https://my.oschina.net/chinesedragon/blog/1647846 Spring Boot 2.0 多数据源编程 在Spring Boot 1.5.x之前,多数据 ...

  7. c语言谭浩强ppt课件,编程_C语言学习课件_谭浩强_PPT~1216F.ppt

    编程_C语言学习课件_谭浩强_PPT~1216F.ppt ,第一章,C语言概述本章要点,C语言的特点 C程序的结构 在计算机上运行C程序的方法主要内容,1.1 语言出现的历史背景 1.2 程序的特点 ...

  8. HTML CSS 学习整理

    HTML CSS 学习整理 码字不易,转载请务必注明原文出处.常用单位整理,不断学习,后期的新增笔记会继续加到文章上方 点击链接后退页面: 回到上一个网页 这是一个简单的跳转页面操作 --修改plac ...

  9. Python学习整理(之一)

    Python 学习整理 数据类型,函数,运算符,bool值,选择结构 Python 学习整理 一,基本的参数类型 二,函数 print()函数 input()函数和int(),float() 三,运算 ...

最新文章

  1. [转]python yield
  2. sysbench OLTP基准测试
  3. 小数在内存中的存储表示
  4. verilog时钟翻转怎么写_verilog实时可调时钟代码
  5. 企业运维几百个重点面试题汇总(老男孩)
  6. According to the overall view of the patent
  7. php array_diff 用法
  8. fasfdfs安装记录(CentOS7)
  9. 图片压缩兼修改md5
  10. 鸿蒙系统是华容网格吗,鸿蒙上手机还在迟疑,国内对手却已悄然来到
  11. bugku——蹭网先解开密码(EWSA,hashcat破解wifi握手包)
  12. android webview打开pdf文件
  13. ASP.NET MVC入门
  14. 配置IIS,以及添加网站
  15. VPS,虚拟主机,云主机,独立服务器区别
  16. 如何做好软文推广?软文推广有哪些宣传平台值得推荐
  17. 如何解决因涉及不良信息导致QQ互联审核不通过?
  18. 第十二届蓝桥杯第二期模拟赛(java) python解法
  19. matlab在二维平面和三维空间中绘制圆形
  20. 做个表白页面需要掌握哪些英语单词?

热门文章

  1. HDU2191 多重背包或者01背包 xingxing在努力
  2. 用 或 || 取代常规 if - else 结构
  3. 【思维】javascript选择排序
  4. Crystal Reports Maximum Report Processing Jobs Limit
  5. java蓝桥杯算法训练 奇偶判断
  6. 数学连乘和累加运算符号_数学符号归纳
  7. python获取小王的ip地址_用Python获取本机的IP地址
  8. nginx简介--理解nginx配置/模块/openresty
  9. Redis之运维细节
  10. (02)Verilog HDL模块