《Storm源码分析》从源代码的角度详细分析了Storm的设计与实现,共分为三个部分,第一部分介绍了Storm的基本原理以及Storm集群系统的搭建方法,第二部分深入剖析了Storm的底层架构,如Nimbus、Supervisor、Worker以及Task,第三部分系统讨论了Storm如何实现可靠的消息传输,如TransactionTopology以及Trident。
《Storm源码分析》适用于程序员、架构师以及计算机专业的学生。
目录
- 第1章总体架构与代码结构1
- 1.1Storm的总体结构1
- 1.2Storm的元数据3
- 1.2.1元数据介绍3
- 1.2.2Storm怎么使用这些元数据4
- 1.3Storm的代码结构7
- 1.3.1Clojure代码7
- 1.3.2Java代码8
- 1.3.3Trident代码9
- 1.3.4其他代码10
- 第2章搭建Storm集群11
- 2.1搭建单机Storm集群11
- 2.2搭建多机Storm集群14
- 2.2.1设置环境14
- 2.2.2启动Storm集群15
- 2.2.3提交Topology15
- 2.3WordCountTopology介绍15
- 2.3.1RandomSentenceSpout15
- 2.3.2SplitSentence16
- 2.3.3WordCount17
- 2.3.4WordCountTopology构建17
- 第3章Storm编程基础19
- 3.1Fields定义19
- 3.2Tuple接口20
- 3.3常用声明接口21
- 3.3.1配置声明接口22
- 3.3.2输入声明接口23
- 3.3.3输出字段声明接口24
- 3.3.4组件声明接口25
- 3.4Spout输出收集器25
- 3.4.1ISpoutOutputCollector和SpoutOutputCollector25
- 3.4.2Executor中ISpoutOutputCollector的实现27
- 3.5Bolt输出收集器28
- 3.5.1IOutputCollector和OutputCollector28
- 3.5.2IBasicOutputCollector和BasicOutputCollector31
- 3.5.3BatchOutputCollector和BatchOutputCollectorImpl32
- 3.5.4Executor中的IOutputCollector实现34
- 3.6组件接口35
- 3.7Spout接口35
- 3.7.1ISpout36
- 3.7.2IRichSpout38
- 3.8Bolt接口38
- 3.8.1IBolt38
- 3.8.2IRichBolt40
- 3.8.3IBasicBolt40
- 3.8.4IBatchBolt42
- 3.8.5小结45
- 3.9Storm数据结构46
- 3.9.1GlobalStreamId46
- 3.9.2消息分组方式46
- 3.9.3StreamInfo47
- 3.9.4ShellComponent47
- 3.9.5ComponentObject47
- 3.9.6ComponentCommon47
- 3.9.7SpoutSpec48
- 3.9.8Bolt48
- 3.9.9StormTopology49
- 3.9.10TopologySummary49
- 3.9.11SupervisorSummary49
- 3.9.12ClusterSummary50
- 3.9.13BoltStats50
- 3.9.14SpoutStats50
- 3.9.15统计信息50
- 3.9.16DRPC51
- 3.10基本Topology构建器52
- 3.10.1TopologyBuilder52
- 3.10.2ConfigGetter55
- 3.10.3SpoutGetter和BoltGetter55
- 3.10.4一个简单例子56
- 3.11异常处理57
- 第4章基础函数和工具类58
- 4.1计时器58
- 4.1.1mk-timer58
- 4.1.2check-active!60
- 4.1.3schedule60
- 4.1.4schedule-recurring60
- 4.1.5cancel-timer61
- 4.2async-loop61
- 4.3event-manager62
- 4.4even-sampler63
- 4.5ZooKeeper工具类64
- 4.5.1mk-client64
- 4.5.2create-node65
- 4.5.3get-data65
- 4.5.4进程内启动ZooKeeper66
- 4.6LocalState66
- 4.7ClusterState68
- 4.8StormClusterState69
- 第5章通信机制71
- 5.1进程间通信71
- 5.1.1进程间通信协议71
- 5.1.2LocalCluster模式实现72
- 5.1.3分布式模式实现73
- 5.1.4协议使用75
- 5.2进程内通信77
- 5.2.1Disruptor Queue的使用77
- 5.2.2DisruptorQueue的Clojure处理器80
- 第6章Nimbus81
- 6.1Nimbus服务接口定义81
- 6.2Nimbus相关的数据结构83
- 6.2.1Java 数据结构83
- 6.2.2Clojure数据结构84
- 6.3Nimbus中的线程介绍86
- 6.3.1mk-assignments87
- 6.3.2do-cleanup89
- 6.3.3clean-inbox90
- 6.4Topology状态转移90
- 6.4.1transition-name!90
- 6.4.2transition!91
- 6.4.3state-transitions92
- 6.5启动Nimbus服务96
- 6.5.1launch-server!96
- 6.5.2service-handler97
- 6.6关闭Nimbus服务99
- 6.7主要服务方法99
- 6.7.1submitTopology99
- 6.7.2kill、rebalance、activate、deactivate 方法101
- 6.7.3文件上传与下载102
- 6.7.4获取UI所需的信息104
- 6.7.3获取Topology106
- 6.7.6获取Storm配置项107
- 6.8主要辅助方法107
- 6.8.1system-topology!107
- 6.8.2normalize-topology112
- 6.8.3compute-new-topology->executor->node+port114
- 6.8.4compute-executors117
- 第7章Scheduler119
- 7.1IScheduler接口119
- 7.2EvenScheduler120
- 7.2.1schedule-topolpgies-evenly120
- 7.2.2schedule-topology121
- 7.2.3get-alive-assigned-node+port->executors122
- 7.2.4sort-slots123
- 7.3DefaultScheduler124
- 7.3.1default-schedule124
- 7.3.2slots-can-reassign126
- 7.3.3bad-slots126
- 7.4IsolationScheduler127
- 7.5调度示例131
- 7.5.1EvenScheduler和DefaultScheduler131
- 7.5.2IsolationScheduler134
- 第8章Scheduler137
- 8.1与Supervisor相关的数据结构137
- 8.1.1standalone-supervisor137
- 8.1.2Supervisor的数据138
- 8.1.3本地存储数据139
- 8.2Supervisor中的线程140
- 8.2.1计时器线程140
- 8.2.2同步Nimbus任务的线程140
- 8.2.3管理Worker进程的线程143
- 8.3启动Supervisor145
- 8.4关闭Supervisor147
- 8.5重要方法介绍147
- 8.5.1launch-worker147
- 8.5.2read-allocated-workers150
- 8.5.3wait-for-worker-launch151
- 8.5.4shutdown-worker152
- 8.5.5download-storm-code152
- 第9章Worker155
- 9.1Worker中的数据155
- 9.2Worker中的计时器157
- 9.2.1Worker的心跳157
- 9.2.2Executor的心跳158
- 9.2.3Worker中对ZMQ连接的维护159
- 9.2.4从ZooKeeper获取Topology的活跃情况161
- 9.2.5小结162
- 9.3创建Worker163
- 9.4关闭Worker164
- 9.5重要辅助方法介绍165
- 9.5.1Worker中的接收函数166
- 9.5.2Worker中的发送函数167
- 9.5.3获取属于Worker的Executor169
- 9.5.4创建Executor的接收消息队列和查找表169
- 9.5.5下载Topology的配置项以及代码170
- 9.6小结171
- 第10章Executor172
- 10.1Executor的数据172
- 10.2Executor的输入和输出174
- 10.2.1Executor的输入及处理174
- 10.2.2Executor的输出及发送175
- 10.3Spout类型的Executor176
- 10.3.1准备消息循环的数据176
- 10.3.2Spout输入处理函数178
- 10.3.3Spout消息发送函数180
- 10.3.4Spout对象的初始化181
- 10.3.5消息循环182
- 10.4Bolt类型的Executor184
- 10.4.1准备消息循环的数据184
- 10.4.2Bolt输入处理函数184
- 10.4.3Bolt的消息发送函数185
- 10.4.4Bolt对象的初始化185
- 10.4.5消息循环186
- 10.5创建Executor187
- 10.6辅助函数介绍188
- 10.6.1组件的Grouper函数188
- 10.6.2带流量控制的错误报告方法193
- 10.6.3触发系统Ticks194
- 10.7小结196
- 第11章Task198
- 11.1Task的上下文对象198
- 11.1.1TopologyContext198
- 11.1.2GeneralTopologyContext199
- 11.1.3WorkerTopologyContext200
- 11.1.4TopologyContext201
- 11.2创建Task数据202
- 11.3mk-tasks-fn函数204
- 11.4send-unanchored205
- 11.5创建Task206
- 11.6Storm中传输的消息以及序列化206
- 第12章Storm的Ack框架208
- 12.1Acker Bolt的实现分析209
- 12.2启动消息跟踪211
- 12.3消息跟踪212
- 12.4Ack机制的例子214
- 第13章系统运行统计216
- 13.1基础数据结构以及更新算法216
- 13.1.1滑动窗口的数据结构216
- 13.1.2滑动窗口的回调函数220
- 13.1.3滑动窗口集合的类型221
- 13.2Storm中的统计信息222
- 13.2.1Stats中定义的统计类别222
- 13.2.2运行统计的更新223
- 13.2.3运行统计的更新时间点223
- 13.2.4获取统计数据228
- 13.3运行统计的Thrift结构229
- 第14章系统运行统计的另一种实现231
- 14.1内置统计信息的计算231
- 14.1.1MultiCountMetric232
- 14.1.2MultiReducedMetric233
- 14.2内置统计类型234
- 14.2.1Spout类型的内置统计235
- 14.2.2Bolt类型的内置统计235
- 14.3统计触发消息235
- 14.3.1注册统计信息236
- 14.3.2触发消息的产生与发送237
- 14.3.3处理统计触发消息238
- 14.4运行统计收集节点239
- 14.5SystemBolt241
- 第15章事务Topology的实现243
- 15.1事务Topology的实现概述243
- 15.1.1事务Topology的类型244
- 15.1.2事务Topology的类关系245
- 15.2ITransactionalSpout接口246
- 15.3协调Spout节点的执行器248
- 15.3.1ZooKeeper客户端工具248
- 15.3.2协调Spout的执行器255
- 15.3.3消息发送Bolt的执行器261
- 15.4CoordinatedBolt的实现分析264
- 15.4.1TrackingInfo264
- 15.4.2CoordinatedOutput-Collector265
- 15.4.3CoordinatedBolt中的消息类型267
- 15.4.4成员变量以及主要方法分析267
- 15.5分区的事务类型271
- 15.5.1分区的事务Spout接口271
- 15.5.2分区的事务Spout的执行器273
- 15.6分区的模糊事务Spout277
- 15.6.1分区的模糊事务Spout的接口277
- 15.6.2模糊的事务Spout执行器278
- 15.7事务Topology的构建器281
- 15.7.1构建器的构造函数及成员变量281
- 15.7.2设置Bolt对象283
- 15.7.3构建Topology284
- 15.7.4输入流声明器286
- 第16章事务Topology示例288
- 16.1例子代码288
- 16.1.1分区的事务Spout288
- 16.1.2局部计数Bolt的实现291
- 16.1.3全局计数Bolt的实现292
- 16.2构建Topology293
- 16.3事务处理示例295
- 第17章Trident的Spout节点298
- 17.1ITridentSpout接口298
- 17.1.1BatchCoordinator接口299
- 17.1.2TridentSpoutCoordinator300
- 17.1.3MasterBatchCoordinator301
- 17.1.4消息发送节点接口306
- 17.1.5消息发送接口的执行器306
- 17.2适配IRichSpout接口307
- 17.3适配IBatchSpout接口311
- 17.4Trident中分区的Spout类型311
- 17.4.1分区Spout接口311
- 17.4.2分区Spout的执行器313
- 17.5模糊事务类型的Spout节点316
- 17.5.1模糊事务类型的Spout接口317
- 17.5.2模糊事务类型Spout的执行器317
- 17.6构建Spout节点320
- 17.6.1TridentTopology的newStream调用320
- 17.6.2TridentTopology中newDRPCStream调用321
- 第18章Trident的存储322
- 18.1存储的基本接口322
- 18.2MapState接口的实现323
- 18.2.1非事务类型的存储324
- 18.2.2事务类型的存储325
- 18.2.3模糊事务类型存储327
- 18.3值的序列化方法329
- 18.4数据更新接口330
- 18.4.1CombinerValueUpdater330
- 18.4.2ReducerValueUpdater331
- 18.5存储更新接口331
- 18.5.1ReducerAggStateUpdater332
- 18.5.2MapReducerAggStateUpdater332
- 18.5.3BaseStateUpdater334
- 18.6创建存储对象334
- 第19章Trident消息336
- 19.1ValuePointer336
- 19.2Factory接口及其实现337
- 19.2.1ProjectionFactory338
- 19.2.2FreshOutputFactory339
- 19.2.3OperationOutputFactory339
- 19.2.4RootFactory341
- 19.3消息工厂的例子342
- 19.4TridentTupleView342
- 19.5ComboList343
- 第20章Trident操作与处理节点346
- 20.1操作的基本接口346
- 20.2Aggregator实现347
- 20.2.1GroupedAggregator348
- 20.2.2ChainedAggregatorImpl350
- 20.2.3SingleEmitAggregator353
- 20.3用户接口及其实现355
- 20.3.1ReducerAggregator接口及其实现355
- 20.3.2CombinerAggregator接口及其实现356
- 20.4所有处理节点的上下文357
- 20.4.1单个处理节点的上下文358
- 20.4.2操作执行的上下文359
- 20.5Trident的输出收集器359
- 20.5.1FreshCollector359
- 20.5.2CaptureCollector360
- 20.5.3GroupCollector360
- 20.5.4AppendCollector361
- 20.5.5AddIdCollector361
- 20.6Trident的处理节点362
- 20.6.1TridentProcessor接口363
- 20.6.2PartitionPersistProcessor363
- 20.6.3StateQueryProcessor365
- 20.7聚集器的执行367
- 第21章Trident流的基本操作370
- 21.1流的成员变量和基础方法370
- 21.1.1流的成员变量370
- 21.1.2流节点名字370
- 21.1.3流的映射检查372
- 21.1.4添加节点372
- 21.2流映射操作373
- 21.3流的分组操作374
- 21.4流的逐行操作374
- 21.5流的分区操作374
- 21.6流的单聚集器聚集操作376
- 21.7流的多聚集器聚集操作377
- 21.7.1ChainedAggregatorDeclarer377
- 21.7.2分区上的局部聚集操作379
- 21.7.3全局聚集操作379
- 21.7.4含有多个聚集器的partitionAggregate操作381
- 21.8流的聚集操作382
- 21.9流的分区写入操作383
- 21.10查询操作384
- 21.11流的全局写入操作384
- 21.12流的操作与有向图构建384
- 21.13分组流385
- 21.13.1成员变量385
- 21.13.2逐行操作385
- 21.13.3分组流的分区聚集操作386
- 21.13.4查询操作386
- 21.13.5聚集操作386
- 21.13.6写入操作387
- 21.14利用流操作来构建Topology的例子388
- 第22章Trident中流的交互操作392
- 22.1基本接口392
- 22.2JoinerMultiReducer393
- 22.2.1成员变量及构造函数393
- 22.2.2execute方法395
- 22.2.3complete方法397
- 22.3GroupedMultiReducerExecutor397
- 22.4MultiReducerProcessor399
- 22.5连接操作401
- 22.6流合并操作403
- 第23章Trident中的Bolt节点404
- 23.1SubTopologyBolt404
- 23.1.1输入准备404
- 23.1.2成员变量405
- 23.1.3主要方法406
- 23.2Trident中的Bolt执行器409
- 23.2.1ITridentBatchBolt接口410
- 23.2.2TrackedBatch410
- 23.2.3定制的输出收集器412
- 23.2.4消息类型414
- 23.2.5数据成员分析414
- 23.2.6主要成员方法分析416
- 第24章Trident的执行优化420
- 24.1节点类型420
- 24.1.1基本节点类型420
- 24.1.2Spout节点422
- 24.1.3处理节点422
- 24.1.4分区节点423
- 24.2执行优化算法426
- 24.2.1节点组426
- 24.2.2节点组的合并算法427
- 24.2.3处理节点组中的分区节点431
- 24.2.4节点组以不同的方式收听相同流431
- 24.2.5执行优化后的节点组434
- 24.2.6计算节点组的并行度434
- 第25章Trident与DRPC437
- 25.1DRPC服务器438
- 25.1.1DRPC服务器的成员变量438
- 52.1.2DRPC用户接口及其实现439
- 25.1.3DRPC Topology端接口及其实现440
- 25.1.4启动DRPC服务器441
- 25.2DRPC的客户端442
- 25.3DRPC中Spout节点443
- 25.4DRPC Spout的执行器446
- 25.5completeDRPC操作449
- 25.6返回DRPC结果451
- 第26章Trident的Topology构建器453
- 26.1基本工具函数453
- 26.1.1committerBatches453
- 26.1.2fleshOutStreamBatchIds453
- 26.1.3getOutputStreamBatchGroups454
- 26.2TridentTopologyBuilder455
- 26.2.1成员变量455
- 26.2.2设置Spout节点456
- 26.2.3设置Bolt节点458
- 26.3一个例子460
- 第27章多语言462
- 27.1ShellProcess462
- 27.2ShellBolt464
- 27.2.1成员变量464
- 27.2.2读写线程465
- 27.3ShellSpout467
- 第28章Storm中的配置项469