http://storm.apache.org/releases/1.0.1/Structure-of-the-codebase.html

  • Structure of the codebase
源码分成独立的三层
第一:在最开始的时候Storm就被设计成支持多种语言,Nimbus是一种Thrift的服务,Topologies是一种Thrift类型的结构。Thrift的使用使得Storm可以被任何语言使用。
第二:所有的Storm的接口都被声明为java接口,虽然内部的实现有很多的Clojure但是所有的使用必须通过java api。这意味着所有的特性都可以通过java调用。
第三:Storm的实现很大一部分是Clojure,但是有接近一半的java代码,但是因为Clojure表达性强,所以绝大多数的逻辑的实现都在Clojure中。
下面的部分详细解释每一部分
    • 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的代码库的结构的更多相关文章

  1. iOS流行的开源代码库

    本文介绍一些流行的iOS的开源代码库 1.AFNetworking 更新频率高的轻量级的第三方网络库,基于NSURL和NSOperation,支持iOS和OSX.https://github.com/ ...

  2. 打造smali代码库辅助分析

    打造smali代码库辅助分析 在分析Android应用程序的时候,我们往往会插入代码重打包apk来辅助我们分析的工作 一个比较取巧的方法就是先用java写好代码以及相关的调用之后, 然后直接扣出代码 ...

  3. Overview of the Oppia codebase(Oppia代码库总览)

    Oppia is built with Google App Engine. Its backend is written in Python, and its frontend is written ...

  4. 我的github代码库

    我的github代码库地址:https://github.com/gooree.Enjoy coding,enjoy sharing.

  5. 使用GitHub for Windows客户端管理京东代码库项目

    1.下载并安装 GitHub for Windows 客户端 https://windows.github.com/ 2.在京东代码库中新的代码库,可以创建私有的代码库 https://code.jd ...

  6. git代码库误操作还原记录

    先做一些前情提要: 我们项目使用git作为代码管理,同时为了操作更方便,安装了乌龟git(tortoiseGit)工具.以下几乎所有操作都是在乌龟git上进行. 我们的项目是分阶段完成的,在完成上一阶 ...

  7. 15分钟学会使用Git和远程代码库

    git是个了不起但却复杂的源代码管理系统.它能支持复杂的任务,却因此经常被认为太过复杂而不适用于简单的日常工作.让我们诚实一记吧:Git是复杂的,我们不要装作它不是.但我仍然会试图教会你用(我的)基本 ...

  8. linux下搭建svn代码库

    1.安装svn客户端 2.创建svn代码库 1.安装svn客户端 1.1.使用命令安装 1)CentOS $ yum install subversion 2)ubuntu sudo apt-get ...

  9. 针对远程Git代码库使用SSH公匙

    → 运行Git Bash→ 创建SSH公匙和私匙ssh-keygen -t rsa→ 输入SSH公匙存放文件,选择使用默认的,按Enter→ 如果已经存在,提示是否重写,输入n,按Enter→ 打开C ...

随机推荐

  1. 使用Perl5获取有道词典释义

    Get Word Definition from dict.youda.com via Perl Script 获取基本释义 Get Basic Definition http://dict.youd ...

  2. Linux系统调用---同步IO: sync、fsync与fdatasync【转】

    转自:http://blog.csdn.net/cywosp/article/details/8767327 [-] 1  write不够需要fsync 2 fsync的性能问题与fdatasync ...

  3. java网络编程之UDP通讯

    详细介绍了java中的网络通信机制,尤其是UDP协议,通过对UDP的基本使用进行举例说明如何使用UDP进行数据的发送接收,并举了两个小demo说明UDP的使用注意事项. UDP协议原理图解: UDP协 ...

  4. 【Pro ASP.NET MVC 3 Framework】.学习笔记.2.MVC的主要工具-Ninject

    这三个工具,应该是每个MVC程序员的兵工厂中的一部分.DI容器,单元测试框架,mocking 工具.Ninject是我们偏爱的DI容器,它简单,高雅,并且容易使用.这里有很多复杂的替代品,但是我们喜欢 ...

  5. linux添加somebody到组

    添加xiluhua到组:test_group usermod -a test_group  xiluhua

  6. Python字符界面函数库

    curses ncurses prettytable from prettytable import PrettyTable row = PrettyTable() row.field_names = ...

  7. 实现Ecshop商品跳到淘宝、京东等的购买链接

    今天简单的实现了一下ecshop商品导出到第三方的购买链接功能.大致思路是给商品添加一个buy_link的text字段,存为json结构,然后通过json解析输出到商品购买页面 1.添加字段 增加购买 ...

  8. postgresql之distinct用法

    1. 去重:关键字distinct去重功能  在其他数据库(oracle,mysql)是存在:当然postgresql也有这个功能 [postgres@sdserver40_210 ~]$ psql ...

  9. dbms_job.submit 单次执行

    DBMS_JOB.SUBMIT用于定时任务,基本用法如下: DBMS_JOB.SUBMIT(:jobno,//job号                                      'yo ...

  10. awk用法小结(作者总结)

    http://www.chinaunix.net/old_jh/24/691456.html http://wenku.baidu.com/view/ebac4fc658f5f61fb736664d. ...