STORM_0008_Structure-of-the-codebase_Storm的代码库的结构
http://storm.apache.org/releases/1.0.1/Structure-of-the-codebase.html
- Structure of the codebase
- storm.thrift
- org.apache.thrift7
- 每一个组件都有一个component id
- Spouts和bolts有相同的Thrift定义
- 一个Thrift definition for bolts包含ComponentObject结构和ComponentCommon结构
- ComponentObject,定义了bolt的实现,可能是下面的三种类型的一种
- 一个Serialized java对象,实现了IBolt
- 一个ShellComponent代表了其他语言的实现,按照这样的方式声明bolt的时候将会造成storm实例化一个ShellBolt对象, 去处理基于JVM的工作进程和非基于JVM的实现的部分之间的通信
- 一个JavaObject结构,传递给storm类名和构造的参数去实例化那个bolt。如果你想用一种非JVM语言去定义拓扑的时候这样是有用的。这样你可以使用基于JVM的spouts和bolts而不必自己创建并且序列化一个java对象。
- ComponentCommon,定义了组件的所有的其他的部分,包含下面的:
- 这个组件发射什么streams,已经每个stream的metadata
- 这个组件消费什么stream
- 这个组件的并行度
- 组件声明的配置信息
- 需要注意的是,spouts的结构也包含了一个ComponentCommon属性,因此,spouts也可以声明去消费其他的输入流。但是JAVA API没有提供这样一种方式使得spout去消费其他的流,如果你放任何的输入声明给spout,那么在提交拓扑的时候,你将会得到一个错误。spouts有一个输入声明的属性不是给用户去使用的 ,而是为了storm自身去使用的。storm添加隐式的流或者bolts给拓扑,去设置acking framework,一个拓扑中每个spout有两个来自acker bolt的隐式的流。伴随着这些流,一旦tuple被检测到完成或者失败,acker发送ack或者fail信息。这些用户的拓扑需要被转换成运行时拓扑。
- Java interfaces
- storm的接口主要被声明为java接口,主要的接口有下面的三个
- IRichBolt
- IRichSpout
- TopologyBuilder
- 大多数的接口的策略是:
- 用一个java的interface声明一个接口
- 合适的时候提供一个基类提供默认的实现
- 一个微妙的区别是IBolt/ISpout和IRichBolt/IRichSpout的区别。主要的区别是是rich版本的接口,多了declareOutputFields方法。有这种区别的原因是因为每个输出流的输出fields的声明需要是Thrift结构的一部分(保证可以从各种语言指定出来),但是作为用户,你希望能够声明流作为自己的类的一部分。TopologyBuilder做的事情是当创建Thrift表示,调用declareOutputFields获取声明,并转换为Thrift结构。
- 实现
- 通过java接口声明所有的功能保证每个特性都能通过java去调用。
- 虽然两个代码量相同,但是Clojure实现了主要的逻辑。但是有两个例外,就是DRPC和transactional topologies的实现。这两个是纯java的实现。这充当了一个抽象,为实现storm的更高程度的抽象。这两个模块的代码在org,apache.storm.coordination,org.apache.storm.drpc,org.apache.storm.transactional包中。
- 下面是主要的java 包和Clojure namespace的功能的总结:
- java packages
- org.apache.storm.coordination:实现了在storm之上的批处理
- org.apache.storm.drpc:DRPC更高程度的抽象
- org.apache.storm.generated:storm生成Thrift代码
- 使用了Thrift的this fork,简单的把这个包重命名为org.apache.thrift7以避免和Thrift版本的冲突
- org.apache.storm.grouping:包含自定义的流分组的接口
- org.apache.storm.hooks:包含钩子进入各种事件的接口,例如当任务发送tuple,当tuple被ack。
- org.apache.storm.serialization:实现了storm序列化和反序列化tuples,基于谷歌的kyro
- org.apache.storm.spout:定义了spout和相关的接口
- org.apache.storm.task:定义了bolt和相关接口,TopologyContext也定义在这
- org.apache.storm.testing:包含了一系列的在单元测试中使用的测试bolts和工具
- org.apache.storm.topology:基于底层的Thrift结构的Java层,为storm提供一个整洁,纯java的API。
- org.apache.storm.transactional:事务拓扑的实现
- org.apache.sorm.tuple:storm的tuple数据模型的实现
- org.apache.storm.utils:代码库使用的数据结构和乱七八糟的工具
- Clojure namespaces
- org.apache.storm.bootstrap:包含了一个宏,可以导入整个代码库需要的各种类和命名空间
- org.apache.storm.clojure:为storm实现了Clojure DSL
- org.apache.storm.cluster:storm守护进程需要的zookeeper逻辑都封装在这个文件中。这个文件的代码,管理了集群的状态在zookeeper的文件系统中的描绘。
- org.apache.storm.command.*:为storm命令行客户端实现了多种的命令,都很短
- org.apache.storm.config:Clojure配置文件的读取和解析的代码。
- org.apache.storm.daemon.acker:acker bolt的实现,是storm保证数据处理的重要的部分。
- org.apache.storm.daemon.common:storm守护进程使用的通用函数的实现,比如,根据拓扑的名字获取拓扑的id等。
- org.apache.storm.daemon.drpc:DRPC server的实现
- org.apache.storm.daemon.nimbus:Nimbus的实现
- org.apache.storm.daemon.supervisor:Supervisor的实现
- org.apache.storm.daemon.task:spout和bolt的独立任务的实现
- org.apache.storm.daemon.worker:工作进程的实现
- org.apache.storm.event:实现一个异步的函数执行器。
- org.apache.storm.log:定义了往log4j中打日志的函数
- org.apache.storm.messaging.*:定义更高层次的接口实现点对点通信,本地模式使用基于内存的java queue,在集群上使用ZeroMQ,通用的接口被定义在protocol.clj中。
- org.apache.storm.stats:统计汇总例程的实现,将这些stats信息发送到zk在UI中显示
- org.apache.atorm.testing:测试拓扑的设施的实现
- org.apache.storm.thrift:包围着Thrift API的 Clojure Wrapper使得使用Thrift结构更加愉悦
- org.apache.storm.timer:后台计时器
- org.apache.storm.ui.*:Storm UI的实现
- org.apache.storm.util:整个代码库使用到的通用工具
- org.apache.storm.zookeeper:包含Zookeeper API的ClojureWrapper实现高层的例如mkdirs和delete recursive的操作。
STORM_0008_Structure-of-the-codebase_Storm的代码库的结构的更多相关文章
- iOS流行的开源代码库
本文介绍一些流行的iOS的开源代码库 1.AFNetworking 更新频率高的轻量级的第三方网络库,基于NSURL和NSOperation,支持iOS和OSX.https://github.com/ ...
- 打造smali代码库辅助分析
打造smali代码库辅助分析 在分析Android应用程序的时候,我们往往会插入代码重打包apk来辅助我们分析的工作 一个比较取巧的方法就是先用java写好代码以及相关的调用之后, 然后直接扣出代码 ...
- Overview of the Oppia codebase(Oppia代码库总览)
Oppia is built with Google App Engine. Its backend is written in Python, and its frontend is written ...
- 我的github代码库
我的github代码库地址:https://github.com/gooree.Enjoy coding,enjoy sharing.
- 使用GitHub for Windows客户端管理京东代码库项目
1.下载并安装 GitHub for Windows 客户端 https://windows.github.com/ 2.在京东代码库中新的代码库,可以创建私有的代码库 https://code.jd ...
- git代码库误操作还原记录
先做一些前情提要: 我们项目使用git作为代码管理,同时为了操作更方便,安装了乌龟git(tortoiseGit)工具.以下几乎所有操作都是在乌龟git上进行. 我们的项目是分阶段完成的,在完成上一阶 ...
- 15分钟学会使用Git和远程代码库
git是个了不起但却复杂的源代码管理系统.它能支持复杂的任务,却因此经常被认为太过复杂而不适用于简单的日常工作.让我们诚实一记吧:Git是复杂的,我们不要装作它不是.但我仍然会试图教会你用(我的)基本 ...
- linux下搭建svn代码库
1.安装svn客户端 2.创建svn代码库 1.安装svn客户端 1.1.使用命令安装 1)CentOS $ yum install subversion 2)ubuntu sudo apt-get ...
- 针对远程Git代码库使用SSH公匙
→ 运行Git Bash→ 创建SSH公匙和私匙ssh-keygen -t rsa→ 输入SSH公匙存放文件,选择使用默认的,按Enter→ 如果已经存在,提示是否重写,输入n,按Enter→ 打开C ...
随机推荐
- 160923、项目管理模式:如何去除SVN标记
项目管理模式:如何去除SVN标记 当我们从工作空间中拷贝一个项目,发现项目特别大.那是因为当使用svn里面保留了每个版本的信息,我们可以通过这个方法来进行去除 当项目不需要SVN标志的时候,我们一般怎 ...
- java 面试每日一题
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半:再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高? import java.util.Scanner; public cl ...
- js 表单操作
order.aspx 订单页- order-detail.aspx订单确认页- 操作:order.aspx提交订单@1,跳转到order-detail.aspx页面,确认页面操作:返回上一步@2- ...
- YTU 2296: KMP模式匹配 二(串)
2296: KMP模式匹配 二(串) 时间限制: 1 Sec 内存限制: 128 MB 提交: 29 解决: 17 题目描述 输入一个主串和一个子串,用KMP进行匹配,问进行几趟匹配才成功,若没成 ...
- HASH表原理(装)
HASH表原理 大家都知道,在所有的线性数据结构中,数组的定位速度最快,因为它可通过数组下标直接定位到相应的数组空间,就不需要一个个查找.而哈希表就是利用数组这个能够快速定位数据的结构解决以上的问题的 ...
- 怎么查看jar包版本
jar包根目录里的META-INF目录下的MANIFEST.MF文件里一般有会记录版本信息,可以到这个文件里查看 打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目录,这个目录 ...
- 20151124002 treeView 数型菜单的操作
20151124002 treeView 数型菜单的操作 protected void FillTree() { SqlConnection1 = new Syst ...
- 精通 ASP.NET MVC 4 学习笔记(一)
这里记录着从 P132 到 P192 的内容.水分很足,大部分是书上的代码,我只加了一些基于我自己的理解的能帮助初学者看懂的注释,并且把书中的部分内容做了一些的拓展. 建立数据层 设置 DI 容器 / ...
- Java中的类加载器
转载:http://blog.csdn.net/zhangjg_blog/article/details/16102131 从java的动态性到类加载机制 我们知道,Java是一种动态语言.那么怎 ...
- lua中奇葩用法
th> a=torch.zeros(,) [.0001s] th> a [torch.DoubleTensor of size 1x5] [.0002s] th> a[] [torc ...