Storm源码阅读之SpoutOutputCollector
不得不说storm是一个特别棒的实时计算框架。为了对后文理解的方便,先说几个storm中的术语:
Topology:拓扑图或者拓扑结构。在storm中它通过消息分组的分式连接Spout和Bolt节点定义了运算处理的拓扑结构。如下图:

那什么是Spout呢?
在计算任务需要的数据其实就是由Spout提供的,所以它可以说是Storm中的消息源,一般是从外部数据源(日志文件、数据库、消息队列等等)不间断地读取数据然后发送给tuple元组的。
那它是通过谁发送的呢?又是如何发送的呢?
这里我们先回答第一个问题,第二个问题以后解答。
好了上面说了那么多就是为了引出今天的任务:阅读SpoutOutputCollector源码。
在阅读之前,我们先明确一下SpoutOutputCollector到底是什么?其实从类名就能说出大概(不得不说老外写的代码的可读性真是好的没法说。这里啰嗦一句,
个人觉得这也是他们分享精神的体现,时刻记住方便给别人看。),它就是Spout输出收集器。
那它到底能干些啥呢?请看代码:
1.ISpoutOutputCollector:是SpoutOutputCollector的接口
public interface ISpoutOutputCollector {
/**
发送tuple消息,并返回起发送任务的task的序列号集合
*/
List<Integer> emit(String streamId, List<Object> tuple, Object messageId);
/**
*与上述发送方法类似,只不过emitDirect方法是要指定接收端的task,让接收端特定的task接收消息。
*/
void emitDirect(int taskId, String streamId, List<Object> tuple, Object messageId);
/**
*处理异常
*/
void reportError(Throwable error);
}
从上述接口ISpoutOutputCollector源码可以看出ISpoutOutputCollector中声明了3个方法,两个属于发送tuple元组的方法,他们之间的差异在上述注释中已说的很清楚,还有一个处理异常的方法。
2.SpoutOutputCollector:它实现了接口ISpoutOutputCollector
public class SpoutOutputCollector implements ISpoutOutputCollector {
ISpoutOutputCollector _delegate;
public SpoutOutputCollector(ISpoutOutputCollector delegate) {
_delegate = delegate;
}
/**
* 指定一个streamid和message发射tuple消息并返回起发送消息的task的序号。当tuple消息完全处理了,就会回调ack方法,否则会回调fail方法。
*/
public List<Integer> emit(String streamId, List<Object> tuple, Object messageId) {
return _delegate.emit(streamId, tuple, messageId);
}
/**
* emit(String streamId, List<Object> tuple, Object messageId)的重载方法,这没有指定streamid,故采用默认的streamid
*/
public List<Integer> emit(List<Object> tuple, Object messageId) {
return emit(Utils.DEFAULT_STREAM_ID, tuple, messageId);
}
/**
* emit(String streamId, List<Object> tuple, Object messageId)
*的重载方法,这没有指定streamid,故采用默认的streamid,因为没有messageid,故ack方法和fail方法不会被调用
*/
public List<Integer> emit(List<Object> tuple) {
return emit(tuple, null);
}
/**
* emit(String streamId, List<Object> tuple, Object messageId)的重载方法,因为没有messageid,故ack方法和fail方法不会被调用
*/
public List<Integer> emit(String streamId, List<Object> tuple) {
return emit(streamId, tuple, null);
}
/**
* 发射tuple消息,不过需要指定接收端的task来接收,并且输出必须声明为直接流,同时指定用来接收消息的task必须采用直接分组的方式来接收消息.
*
*/
public void emitDirect(int taskId, String streamId, List<Object> tuple, Object messageId) {
_delegate.emitDirect(taskId, streamId, tuple, messageId);
}
/**
* emitDirect(int taskId, String streamId, List<Object> tuple, Object messageId)的重载方法,采用默认的streamid
*/
public void emitDirect(int taskId, List<Object> tuple, Object messageId) {
emitDirect(taskId, Utils.DEFAULT_STREAM_ID, tuple, messageId);
}
/**
* emitDirect(int taskId, String streamId, List<Object> tuple, Object messageId)的重载方法,因为没有指定的消息id,所以ack和fail方法就不会调用.
*/
public void emitDirect(int taskId, String streamId, List<Object> tuple) {
emitDirect(taskId, streamId, tuple, null);
}
/**
* 该类提供的重载方法,因为没有指定的消息id,所以ack和fail方法就不会调用.
*/
public void emitDirect(int taskId, List<Object> tuple) {
emitDirect(taskId, tuple, null);
}
/**
* 接口ISpoutOutputCollector中reportError的实现.
*/
@Override
public void reportError(Throwable error) {
_delegate.reportError(error);
}
}
在SpoutOutputCollector类中,实现了消息发射的方法,并且还提供了多个重载方法方便用户使用。
Storm源码阅读之SpoutOutputCollector的更多相关文章
- Apache Storm源码阅读笔记
欢迎转载,转载请注明出处. 楔子 自从建了Spark交流的QQ群之后,热情加入的同学不少,大家不仅对Spark很热衷对于Storm也是充满好奇.大家都提到一个问题就是有关storm内部实现机理的资料比 ...
- storm源码阅读笔记之任务调度算法
3种Scheduler概述 EventScheduler:将系统中的可用资源均匀地分配给需要资源的topology,其实也不是绝对均匀,后续会详细说明 DefaultScheduler:和Evenet ...
- fw: 专访许鹏:谈C程序员修养及大型项目源码阅读与学习
C家最近也有一篇关于如何阅读大型c项目源代码的文章,学习..融合.. -------------------- ref:http://www.csdn.net/article/2014-06-05 ...
- storm源码之storm代码结构【译】【转】
[原]storm源码之storm代码结构[译] 说明:本文翻译自Storm在GitHub上的官方Wiki中提供的Storm代码结构描述一节Structure of the codebase,希望对正 ...
- 【原】storm源码之storm代码结构【译】
说明:本文翻译自Storm在GitHub上的官方Wiki中提供的Storm代码结构描述一节Structure of the codebase,希望对正在基于Storm进行源码级学习和研究的朋友有所帮助 ...
- storm源码之storm代码结构【译】
storm源码之storm代码结构[译] 说明:本文翻译自Storm在GitHub上的官方Wiki中提供的Storm代码结构描述一节Structure of the codebase,希望对正在基于S ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】FMDB源码阅读(二)
[原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...
- 【原】FMDB源码阅读(一)
[原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...
随机推荐
- 聊聊RocksDB Compact
| 导语 对于 LevelCompact 策略,RocksDB会根据每一层不同的策略计算出CompactScore,根据CompactScore大小来决定那一层将会优先进行Compact,然后选择Le ...
- AngularJS高级程序设计读书笔记 -- 大纲篇
零. 初衷 现在 AngularJS 4 已经发布了, 楼主还停留在 1.x 的阶段, 深感自卑. 学习 AngularJS 的初衷是因为, 去年楼主开始尝试使用 Flask 开发自动化程序, 需要用 ...
- Linux 程序,进程和线程
进程如何使用内存. 当程序文件运行为进程时, 进程在内存中获得空间. 1) Text : 固定大小 存储指令(instruction), 说明每一步的操作. 2) Global Data : 固定大小 ...
- Volley源码分析一
Volley源码分析 虽然在2017年,volley已经是一个逐渐被淘汰的框架,但其代码短小精悍,网络架构设计巧妙,还是有很多值得学习的地方. 第一篇文章,分析了请求队列的代码,请求队列也是我们使用V ...
- JavaScript练习笔记整理·3 - 6.25
欢迎和大家一起来讨论~ 基础练习(1): 我的解答为: function array_diff(a, b) { if (b == "") return a; return ...
- CSS学习笔记05 display属性
HTML标记一般分为块标记和行内标记两种类型,它们也称块元素和行内元素. 块元素 每个块元素通常都会独自占据一整行或多整行,可以对其设置宽度.高度.对齐等属性,常用于网页布局和网页结构的搭建.并且块级 ...
- PHP容器--Pimple运行流程浅析
需要具备的知识点 闭包 闭包和匿名函数在PHP5.3.0中引入的. 闭包是指:创建时封装周围状态的函数.即使闭包所处的环境不存在了,闭包中封装的状态依然存在. 理论上,闭包和匿名函数是不同的概念.但是 ...
- 7.modifier插件的自定义和使用
1.在plugins下面创建一个文件 modifier.changeDate.php 编写: <?php function smarty_modifier_changeDate($utime,$ ...
- OSX MacVim + vim-lldb配置和使用心得
Mac里面默认的编译器是clang/clang++ 所以debugger就选择了lldb 想搭配MacVim一起使用,于是就找到了vim-lldb这个插件,相当强大 这个插件支持Vundle,所以 ...
- Discuz论坛提速优化技巧
Discuz是国内最受站长们欢迎的建站源码之一,除了开源以外还有着很强大的后台,即便是没有建站基础和不懂代码的站长也能很快的架设出一个论坛,甚至是门户. 一个网站的加载速度除了影响你在搜索引擎里的排名 ...