不得不说storm是一个特别棒的实时计算框架。为了对后文理解的方便,先说几个storm中的术语:

Topology:拓扑图或者拓扑结构。在storm中它通过消息分组的分式连接Spout和Bolt节点定义了运算处理的拓扑结构。如下图:

那什么是Spout呢?

在计算任务需要的数据其实就是由Spout提供的,所以它可以说是Storm中的消息源,一般是从外部数据源(日志文件、数据库、消息队列等等)不间断地读取数据然后发送给tuple元组的。

那它是通过谁发送的呢?又是如何发送的呢?

这里我们先回答第一个问题,第二个问题以后解答。

好了上面说了那么多就是为了引出今天的任务:阅读SpoutOutputCollector源码。

在阅读之前,我们先明确一下SpoutOutputCollector到底是什么?其实从类名就能说出大概(不得不说老外写的代码的可读性真是好的没法说。这里啰嗦一句,

个人觉得这也是他们分享精神的体现,时刻记住方便给别人看。),它就是Spout输出收集器。

那它到底能干些啥呢?请看代码:

1.ISpoutOutputCollector:是SpoutOutputCollector的接口

  1. public interface ISpoutOutputCollector {
  2. /**
  3. 发送tuple消息,并返回起发送任务的task的序列号集合
  4. */
  5. List<Integer> emit(String streamId, List<Object> tuple, Object messageId);
  6. /**
  7. *与上述发送方法类似,只不过emitDirect方法是要指定接收端的task,让接收端特定的task接收消息。
  8. */
  9. void emitDirect(int taskId, String streamId, List<Object> tuple, Object messageId);
  10. /**
  11. *处理异常
  12. */
  13. void reportError(Throwable error);
  14. }

从上述接口ISpoutOutputCollector源码可以看出ISpoutOutputCollector中声明了3个方法,两个属于发送tuple元组的方法,他们之间的差异在上述注释中已说的很清楚,还有一个处理异常的方法。

2.SpoutOutputCollector:它实现了接口ISpoutOutputCollector

  1. public class SpoutOutputCollector implements ISpoutOutputCollector {
  2. ISpoutOutputCollector _delegate;
  3.  
  4. public SpoutOutputCollector(ISpoutOutputCollector delegate) {
  5. _delegate = delegate;
  6. }
  7.  
  8. /**
  9. * 指定一个streamid和message发射tuple消息并返回起发送消息的task的序号。当tuple消息完全处理了,就会回调ack方法,否则会回调fail方法。
  10. */
  11. public List<Integer> emit(String streamId, List<Object> tuple, Object messageId) {
  12. return _delegate.emit(streamId, tuple, messageId);
  13. }
  14.  
  15. /**
  16. * emit(String streamId, List<Object> tuple, Object messageId)的重载方法,这没有指定streamid,故采用默认的streamid
  17. */
  18. public List<Integer> emit(List<Object> tuple, Object messageId) {
  19. return emit(Utils.DEFAULT_STREAM_ID, tuple, messageId);
  20. }
  21.  
  22. /**
  23. * emit(String streamId, List<Object> tuple, Object messageId)
  24. *的重载方法,这没有指定streamid,故采用默认的streamid,因为没有messageid,故ack方法和fail方法不会被调用
  25. */
  26. public List<Integer> emit(List<Object> tuple) {
  27. return emit(tuple, null);
  28. }
  29.  
  30. /**
  31. * emit(String streamId, List<Object> tuple, Object messageId)的重载方法,因为没有messageid,故ack方法和fail方法不会被调用
  32. */
  33. public List<Integer> emit(String streamId, List<Object> tuple) {
  34. return emit(streamId, tuple, null);
  35. }
  36.  
  37. /**
  38. * 发射tuple消息,不过需要指定接收端的task来接收,并且输出必须声明为直接流,同时指定用来接收消息的task必须采用直接分组的方式来接收消息.
  39. *
  40. */
  41. public void emitDirect(int taskId, String streamId, List<Object> tuple, Object messageId) {
  42. _delegate.emitDirect(taskId, streamId, tuple, messageId);
  43. }
  44.  
  45. /**
  46. * emitDirect(int taskId, String streamId, List<Object> tuple, Object messageId)的重载方法,采用默认的streamid
  47. */
  48. public void emitDirect(int taskId, List<Object> tuple, Object messageId) {
  49. emitDirect(taskId, Utils.DEFAULT_STREAM_ID, tuple, messageId);
  50. }
  51.  
  52. /**
  53. * emitDirect(int taskId, String streamId, List<Object> tuple, Object messageId)的重载方法,因为没有指定的消息id,所以ack和fail方法就不会调用.
  54. */
  55. public void emitDirect(int taskId, String streamId, List<Object> tuple) {
  56. emitDirect(taskId, streamId, tuple, null);
  57. }
  58.  
  59. /**
  60. * 该类提供的重载方法,因为没有指定的消息id,所以ack和fail方法就不会调用.
  61. */
  62. public void emitDirect(int taskId, List<Object> tuple) {
  63. emitDirect(taskId, tuple, null);
  64. }
  65. /**
  66. * 接口ISpoutOutputCollector中reportError的实现.
  67. */
  68. @Override
  69. public void reportError(Throwable error) {
  70. _delegate.reportError(error);
  71. }
  72. }

在SpoutOutputCollector类中,实现了消息发射的方法,并且还提供了多个重载方法方便用户使用。

Storm源码阅读之SpoutOutputCollector的更多相关文章

  1. Apache Storm源码阅读笔记

    欢迎转载,转载请注明出处. 楔子 自从建了Spark交流的QQ群之后,热情加入的同学不少,大家不仅对Spark很热衷对于Storm也是充满好奇.大家都提到一个问题就是有关storm内部实现机理的资料比 ...

  2. storm源码阅读笔记之任务调度算法

    3种Scheduler概述 EventScheduler:将系统中的可用资源均匀地分配给需要资源的topology,其实也不是绝对均匀,后续会详细说明 DefaultScheduler:和Evenet ...

  3. fw: 专访许鹏:谈C程序员修养及大型项目源码阅读与学习

      C家最近也有一篇关于如何阅读大型c项目源代码的文章,学习..融合.. -------------------- ref:http://www.csdn.net/article/2014-06-05 ...

  4. storm源码之storm代码结构【译】【转】

    [原]storm源码之storm代码结构[译]  说明:本文翻译自Storm在GitHub上的官方Wiki中提供的Storm代码结构描述一节Structure of the codebase,希望对正 ...

  5. 【原】storm源码之storm代码结构【译】

    说明:本文翻译自Storm在GitHub上的官方Wiki中提供的Storm代码结构描述一节Structure of the codebase,希望对正在基于Storm进行源码级学习和研究的朋友有所帮助 ...

  6. storm源码之storm代码结构【译】

    storm源码之storm代码结构[译] 说明:本文翻译自Storm在GitHub上的官方Wiki中提供的Storm代码结构描述一节Structure of the codebase,希望对正在基于S ...

  7. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  8. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

  9. 【原】FMDB源码阅读(一)

    [原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...

随机推荐

  1. Spring+SpringMVC+MyBatis深入学习及搭建(十二)——SpringMVC入门程序(一)

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6999743.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十一)——S ...

  2. solr5Ik分词2

    <!--IK分词器--><fieldType name="text_ik" class="solr.TextField"><ana ...

  3. tomcat之 Tomcat 7.0.78 单机多实例配置

    前言:JDK(JavaDevelopment Kit)是Sun Microsystems针对Java开发员的产品.自从Java推出以来,JDK已经成为使用最广泛的javaSDK. JDK是整个Java ...

  4. Bash shell执行命令的优先级

    1.别名2.关键字:if.function.while .until等3.函数4.内置命令5.可执行程序或脚本 别关函内可 =-=-=-=-=Powered by Blogilo

  5. [转]Java多线程学习(吐血超详细总结)

    转自:http://www.mamicode.com/info-detail-517008.html 本文主要讲了Java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法. ...

  6. 【知识整理】这可能是最好的RxJava 2.x 入门教程(二)

    这可能是最好的RxJava 2.x入门教程系列专栏 文章链接: 这可能是最好的RxJava 2.x 入门教程(一) GitHub 代码同步更新:https://github.com/nanchen22 ...

  7. 【CC2530入门教程-04】CC2530的定时/计数器原理与应用

    第4课  CC2530的定时/计数器原理与应用 广东职业技术学院  欧浩源 一.定时/技术器的基本原理 定时/计数器,是一种能够对内部时钟信号或外部输入信号进行计数,当计数值达到设定要求时,向CPU提 ...

  8. MySQL 5.7 在windows下修改max_allowed_packet变量

    (一)执行sql遇到的错误如下: ### Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (387 ...

  9. [leetcode-625-Minimum Factorization]

    Given a positive integer a, find the smallest positive integer b whose multiplication of each digit ...

  10. C#窗体多语言切换(简繁)

    多窗体最好继承一个父窗体,在父窗体Load事件中执行此方法 添加引用 using Microsoft.VisualBasic; #region 语言切换 /// <summary> /// ...