Storm入门(十一)Twitter Storm源代码分析之CoordinatedBolt
作者: xumingming | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
网址: http://xumingming.sinaapp.com/811/twitter-storm-code-analysis-coordinated-bolt/
关于Twitter Storm的新特性: Transactional Topology 被问到的最多的问题是: Storm是怎么知道一个Bolt处理完成了它所有的tuple的? 其实要做到这一点还是有蛮多事情要做的, 幸运的是Storm已经提供了一个Bolt,帮我们把这些事情都做掉了。这个牛逼的bolt就是
CoordinatedBolt . 重要的是 CoordinatedBolt
的实现也是在storm的原语:spout, bolt这些基础之上的 — 也就是说即使作者不提供,我们自己也可以实现。我们来看看这个类的实现原理。
虽然CoordinatedBolt所发挥的作用很牛逼,但是其实它的原理并不是很复杂。它现在被用在两个场景里面:
- DRPC
- Transactional Topology
在看 CoordinatedBolt
的原理之前,我们先看看到底什么叫”处理完了”, 到底处理完什么了?
其实CoordinatedBolt对于业务不是完全没有侵入的,要使用CoordinatedBolt提供的功能,你必须要保证你的每个bolt发送的每个tuple的第一个field是 request-id
, 那么所谓的”做完了”的意思是说当前这个bolt对于当前这个”request-id”所需要做的工作做完了。 这个 request-id
在 DRPC
里面代表一个DRPC请求;在Transactional Topology里面代表一个batch.
CoordinatedBolt的原理是这样的:
- 对于用户在DRPC, Transactional Topology里面的Bolt,都被CoordinatedBolt包装了一层:也就是说在DRPC, Transactional Topology里面的topology里面运行的已经不是用户提供的原始的Bolt, 而是一堆CoordinatedBolt, CoordinatedBolt把这些Bolt的事务都代理了。
- 有了这个代理层,CoordinatedBolt就可以做它的工作了。
- 它会在自己这里维护以下几个数据:
- 哪些上游task要给我发tuple?(通过构造topology的时候所提供的grouping信息可以得知)
- 我给哪些下游task发tuple? (同样通过grouping信息可以得知)
- 每个CoordinatedBolt在每次真正bolt发出一个tuple之后,它都会记录下,这个tuple发给哪个task了。
- 等它所有的tuple都发送完了之后(怎么知道发送完了?等会再说,少安毋躁),它通过另外一个特殊的stream以emitDirect的方式告诉所有它发送过tuple的task,它发送了多少tuple给它。
- 一个bolt在接到所有的上游task发送的tuple个数信息之后,对比它接收到的tuple数量,如果数量对上了,说明它接收到了所有的tuple — 它处理完成了。
- 这样它处理完成了,它可以重复上面的步骤通知它的下游,它的下游再通知它的下游的下游等等。
- 总结一下,每个tuple怎么知道自己处理完成了的?都是靠它的上游通知的。所以只要一个bolt有上游,它就能够知道自己什么时候完成。
- 那总有一个bolt是没有上游的 — 最上面那个bolt。那么这个bolt是怎么知道自己处理完成的呢?靠的是storm的ack系统 — 只要它ack了它的上游(某个非CoordinatedBolt, 在DRPC里面就是PrepareRequest)发送过来的tuple, 它就完成处理这个tuple了。 — 也就是说对于最上面那个bolt来说它只要处理完一个tuple(相对于它的下游要处理很多tuple才算完成)
具体原理如下图:
正如我们在上面讨论到底什么叫”做完成”的概念的时候,我们说了, CoordinatedBolt
的使用对于业务是有侵入的:你必须要在你的每个tuple的第一个字段带上当前 request-id
, 否则 CoordinatedBolt
就跟踪不了了。 一种更优雅的方式是网络协议栈里面IP, TCP协议的处理方式。IP包在TCP包的外面包上IP层需要的信息,而不要求把IP层需要的信息掺杂在TCP的包字段里面,TCP层在发送数据的时候只组装TCP的那些字段,到了IP层自动加上IP层的信息。而IP层把数据包传给TCP层之前也自动去掉IP层的那些信息,TCP只会看到自己层的那些字段,毫无侵入。。作者对于这个问题提了一些改进的措施在 这里
Storm入门(十一)Twitter Storm源代码分析之CoordinatedBolt的更多相关文章
- React Native Android入门实战及深入源代码分析系列(2)——React Native源代码编译
本文为老曾原创.转载需注明出处:viewmode=contents">http://blog.csdn.net/minimicall?viewmode=contents 在上一节中,我 ...
- 【原】Storm 入门教程目录
Storm入门教程 1. Storm基础 Storm Storm主要特点 Storm基本概念 Storm调度器 Storm配置 Guaranteeing Message Processing(消息处理 ...
- Twitter Storm源代码分析之ZooKeeper中的目录结构
徐明明博客:Twitter Storm源代码分析之ZooKeeper中的目录结构 我们知道Twitter Storm的所有的状态信息都是保存在Zookeeper里面,nimbus通过在zookeepe ...
- Twitter Storm源代码分析之Nimbus/Supervisor本地目录结构
storm集群里面工作机器分为两种一种是nimbus, 一种是supervisor, 他们通过zookeeper来进行交互,nimbus通过zookeeper来发布一些指令,supervisor去读z ...
- Storm入门(五)Twitter Storm如何保证消息不丢失
转自:http://xumingming.sinaapp.com/127/twitter-storm如何保证消息不丢失/ storm保证从spout发出的每个tuple都会被完全处理.这篇文章介绍st ...
- twitter storm源码走读之2 -- tuple消息发送场景分析
欢迎转载,转载请注明出处源自徽沪一郎.本文尝试分析tuple发送时的具体细节,本博的另一篇文章<bolt消息传递路径之源码解读>主要从消息接收方面来阐述问题,两篇文章互为补充. worke ...
- twitter storm源码走读之1 -- nimbus启动场景分析
欢迎转载,转载时请注明作者徽沪一郎及出处,谢谢. 本文详细介绍了twitter storm中的nimbus节点的启动场景,分析nimbus是如何一步步实现定义于storm.thrift中的servic ...
- Storm入门(十二)Twitter Storm: DRPC简介
作者: xumingming | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://xumingming.sinaapp.com/756/twitter-stor ...
- Storm入门(十)Twitter Storm: Transactional Topolgoy简介
作者: xumingming | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://xumingming.sinaapp.com/736/twitter-stor ...
随机推荐
- 并发库应用之十三 & 并发集合类的应用
传统集合实现同步的问题 举了一个例子:Map集合线程不同步导致的问题. 解决办法:使用同步的Map集合 使用集合工具类中的方法将不同步的集合转为同步的Collections.synchronizedM ...
- 以太坊ERC20代币开发
以太坊ERC20代币开发首先需要对以太坊,代币,ERC20,智能合约等以太坊代币开发中的基本概念有了解.根据我们的示例代码就可以发行自己的以太坊代币. 什么是ERC20 可以把ERC20简单理解成以太 ...
- Javascript继承,再谈
说到Javascript的继承,相信只要是前端开发者都有所了解或应用,因为这是太基础的知识了.但不知各位有没有深入去理解其中的玄机与奥秘.今本人不才,但也想用自己的理解来说一说这其中的玄机和奥秘. 一 ...
- Java VisualVM无法检测到本地java程序 的 解决办法
win10系统下启动jvisualvm应用,报"VisualVM无法检测到本地java程序"的错误!在网上查了一些方法, 大概原因有2种: 1.操作系统的临时文件目录所在的磁盘格式 ...
- CentOS安装JAVA
http://hermosa-young.iteye.com/blog/1798026 每次都要搜索一下太麻烦了,留个底,方便以后查询 一般情况下,我们都要将linux自带的OPENJDK卸载掉,然后 ...
- VS2012中出现“无法启动程序...debug\abc.exe,系统找不到指定文件”的问题!
VS 2005在生成可执行文件时使用了一种新的技术,该技术生成的可执行文件会伴随生成一个清单文件(manifest file)(.manifest后缀文件)(其本质上是XML文档,你可以用文本编辑器打 ...
- IE下获取XPATH小工具,支持32/64位
背景是曾经友情支持了测试组一小段时间,发现他们使用selenium做页面的自动化测试,需要用到XPath,但IE下没有获取XPath的工具,只能在Firefox和chrome下获取,步骤还比较麻烦.而 ...
- 【深度学习系列】PaddlePaddle垃圾邮件处理实战(一)
PaddlePaddle垃圾邮件处理实战(一) 背景介绍 在我们日常生活中,经常会受到各种垃圾邮件,譬如来自商家的广告.打折促销信息.澳门博彩邮件.理财推广信息等,一般来说邮件客户端都会设置一定的 ...
- fasthttp 文档手册
fasthttp 文档手册 貌似文章有最大长度限制,完整全文地址:https://github.com/DavidCai1993/my-blog/issues/35 常量 const ( Compre ...
- h5区块链项目实战
近来区块链一词很热门,网络上关乎其讨论也很多,这里就不解释了,毕竟几句话也是说不清楚的. 最近得空利用HTML5+css3+jQ开发了一个移动端的区块链项目,感觉界面.布局.效果还是ok的. 项目效果 ...