前言
由于公司业务的需要,我从比较熟悉的Hadoop平台的学习转到了实时计算框架Storm上面,还好其中的很多东西都是类似的,比如JobTracker对应于Storm中的Nimbus等等.相比于Hadoop的这种离线批处理的作业方式,Storm则是跟他完全相反的实时处理计算,数据源源不断的产生,结果同样在不断的产生.
目录结构分析
因为Storm主要由2部分的语言构成,1个是JAVA,还有1个是Clojure,下面的分类重点也将是这2个主要模块的代码另外加1个storm的消息服务模块,就是采用了netty网络模块的部分,这个是在0.9.3中有的,也就是说做目录分析的Storm的版本(还算是比较新,在代码中有部分的clojure的代码没有注释的解释).
Storm源码结构
1.bin
1.1 build_modules.sh
1.2 build_release.sh
1.3 install_zmq.sh
1.4 javadoc.sh
1.5 storm
1.6 to_maven.sh
2.conf
2.1 defaults.yaml
2.2 jaas_digest.conf
2.3 logback.xml
2.4 storm.yaml.example
3.logback
cluster.xml
4.storm-console-logging
4.1 project.clj
4.2 logback
4.2.1 logback.xml
5.storm-core
5.1 src
5.1.1 clj.backtype.storm
5.1.1.1 command 这些命名空间包括了各种"storm xxx"开头的客户端命令行的命令实现。这些实现都很简短
5.1.1.2 daemon storm的守护进程相关的实现
5.1.1.2.1 acker.clj "acker”,bolt的实现。这是Storm确保数据被完全处理的关键组成部分
5.1.1.2.2 builtin_metrics.clj
5.1.1.2.3 common.clj Storm守护进程用到的公共函数
5.1.1.2.4 drpc.clj 包括了DRPC服务器的实现,用来与DRPC topology一起使用
5.1.1.2.5 executor.clj storm的执行器的实现
5.1.1.2.6 logviewer.clj storm的日志查看实现
5.1.1.2.7 nimbus.clj 包括了Nimbus的实现
5.1.1.2.8 supervisor.clj 包括了Supervisor的实现
5.1.1.2.9 task.clj 包括了spout或bolt的task实例实现。包括了处理消息路由、序列化、为UI提供的统计集合及spout、bolt执行动作的实现
5.1.1.2.10 worker.clj 包括了worker进程(1个worker包含很多的task)的实现。包括了消息传输和task启动的实现。
5.1.1.3 messaging 定义了1个高一层次的接口来实现点对点的消息通讯。工作在本地模式时Storm会使用内存中的Java队列来模拟消息传递。工作在集群模式时,消息传递使用的是ZeroMQ。通用的接口在protocol.clj中定义
5.1.1.4 metric 独立的度量的测试代码
5.1.1.5 scheduler 调度模块
5.1.1.6 ui UI展示方面
5.1.2 jvm.backtype.storm
5.1.2.1 clojure
5.1.2.2 coordination 实现了DRPC和事务性topology里用到的基于Storm的批处理功能。这个包里最重要得类是CoordinatedBolt
5.1.2.3 daemon
5.1.2.4 drpc DRPC的更高层次抽象的具体实现
5.1.2.5 generated 自动生成的Thrift代码(利用这里folk出来的Thrift版本生成的,主要是org.apache.thrift包重命名成org.apache.thrift7来避免与其他Thrift版本的冲突)
5.1.2.6 grouping 包含了用户实现自定义stream分组类时需要用到的接口
5.1.2.7 hooks 定义了处理storm各种事件的钩子接口,例如当task发射tuple时、当tuple被ack时
5.1.2.8 messaging 消息相关接口和方法定义
5.1.2.9 metric 含有信息统计Bolt的接口以及SystemBolt实现
5.1.2.10 nimbus Topology有效性检查的接口定义,用于Nimbus
5.1.2.11 planner 执行优化相关类
5.1.2.12 scheduler Nimbus任务调度算法相关的接口
5.1.2.13 security storm的安全方面的类
5.1.2.14 serialization storm序列化/反序列化tuple的实现。在Kryo之上构建
5.1.2.15 spout spout及相关接口的定义
5.1.2.16 state storm下的状态管理相关
5.1.2.17 task bolt及相关接口的定义
5.1.2.18 testing 包括了storm单元测试中用到的各种测试bolt及工具
5.1.2.19 topolpgy 在Thrift结构之上的Java层,用以提供一个纯Java API来使用Storm
5.1.2.20 transactional 包括了事务性topology的实现
5.1.2.21 tuple 包括Storm中tuple数据模型的实现
5.1.2.22 utils 包含了Storm源码中用到的数据结构及各种工具类
5.1.3 storm.trident trident是Storm实时计算的高层抽象.
5.1.3.1 drpc 用于向DRPC服务器返回结果的类实现
5.1.3.2 fluent DRPC的多聚集器操作及分组流
5.1.3.3 graph Topology对应的有向图的构建工具类
5.1.3.4 operation trident的操作中包中包含了聚合,分组,函数和过滤器等的操作实现
5.1.3.5 partition Trident的自定义分组算法
5.1.3.6 planner Topology的执行优化
5.1.3.7 spout trident下的spout实现
5.1.3.8 state trident涉及到的状态的管理
5.1.3.9 testing 测试相关包
5.1.3.10 topology trident下的的topology
5.1.3.11 tuple Trident的消息封装
5.1.3.12 util trident包中的公共方法
5.2 test
5.3 poject.clj
6.storm-lib
6.1 project.clj
7.storm-netty
7.1 src.jvm.backtype.storm.message.netty
7.1.1 Client.java Storm的Client客户端类,包括了一些客户端的连接,请求,接收消息回复等方法
7.1.2 Context.java 上下文类,设置了连接的容器,里面保存了客户端和服务端的连接
7.1.3 ControlMessage.java 控制信息,是一个枚举类,主要包含了消息的状态
7.1.4 MessageBatch.java 消息组,类似于消息堆的概念
7.1.5 MessageDecoder.java 消息解码类,将通道buffer中的内容解码为ControlMessage控制消息
7.1.6 MessageEncoder.java 消息编码类,将当前的控制消息编码到管道buffer中
7.1.7 Server.java Strom的Netty服务端类,里面包括了请求信息队列
7.1.8 StormClientHandler.java Storm客户端处理类,对Netty的客户端进行了一层包装
7.1.9 StormClientPipelineFactory.java Storm客户端处理类的管道工厂类,可以从管道中提取出客户端处理类
7.1.10 StormServerHandler.java Storm服务端处理类,对Netty的服务端做了一层包装
7.1.11 StormServerPipelineFactory.java Storm服务端处理类的管道工厂类,可以从管道中提取出服务端处理类
7.2 test.clj.backtype.storm.message
7.2.1 netty_integration_test.clj netty服务消息模块的集成测试
7.2.2 netty_unit_test.clj netty网络消息模块的单元测试
7.3 project.clj
小结
在这里参考了网上的一些博友们的分享,在此表示感谢,我只是对其进行了集中和再加工,如果有问题,欢迎指出.