第1章 Storm简介 2
1.1 什么是Storm 2
1.2 Storm的诞生 3
1.2.1 从Twitter说起 3
1.2.2 Twitter需要处理大批实时性要求高的大数据业务 4
1.2.3 Storm帮助Twitter解决实时海量大数据处理问题 4
1.3 Storm的成长 5
1.3.1 Storm正式开源 5
1.3.2 Storm的核心技术和基本组成 6
1.3.3 Storm的项目小组 7
1.3.4 Storm的技术支持网站 12
1.4 Storm的优势 15
1.4.1 集成多种技术 15
1.4.2 简单的API 16
1.4.3 可扩展的 16
1.4.4 容错的 16
1.4.5 保证数据处理 17
1.4.6 可以使用任何语言 17
1.4.7 部署和操作简单 17
1.4.8 自由开源 17
1.5 Storm的应用现状和发展趋势 18
1.5.1 应用现状 18
1.5.2 发展趋势 20
1.6 如何学习Storm 22
1.7 本书的章节安排及学习建议 23
1.7.1 本书的章节安排 23
1.7.2 关于如何阅读本书的建议 24
1.8 本章小结 24
第2章 Storm的基本知识 26
2. 1概念 26
2.1.1 元组(Tuple) 26
2.1.2 流(Stream) 27
2.1.3 喷口(Spout) 28
2.1.4 螺栓(Bolt) 28
2.1.5 拓扑(Topology) 29
2.1.6 主控节点与工作节点 29
2.1.7 Nimbus进程与Supervisor进程 29
2.1.8 流分组(Stream grouping) 30
2.1.9 工作进程(Worker) 30
2.1.10 任务(Task) 30
2.1.11 执行器(Executor) 30
2.1.12 可靠性(Reliability) 30
2.2 Storm的配置 31
2.2.1 Storm的配置类型 31
2.2.2 defaults.yaml文件 32
2.2.3 storm.yaml文件 35
2.2.4 Config类 36
2.3 序列化(Serialization) 37
2.3.1 动态类型 37
2.3.2 自定义序列化 37
2.3.3 Java序列化 38
2.3.4 特定组件序列化注册 38
2.4 容错机制 39
2.4.1 Worker进程死亡 39
2.4.2 节点死亡 39
2.4.3 Nimbus或者Supervisor守护进程死亡 39
2.4.4 Nimbus是否是“单点故障”的 39
2.5 可靠性机制——保证消息处理 40
2.5.1 消息被“完全处理”的含义 40
2.5.2 如果一个消息被完全处理或完全处理失败会发生什么 41
2.5.3 Storm如何保证可靠性 41
2.5.4 Storm如何实现可靠性 44
2.5.5 调节可靠性 45
2.6 消息传输机制 46
2.6.1 ZeroMQ 46
2.6.2 Netty 46
2.6.3 自定义消息通信机制 47
2.7 Storm的开发环境与生产环境 47
2.7.1 开发环境与本地模式 47
2.7.2 生产环境与远程模式 47
2.7.3 开发环境与生产环境的对比 48
2.8 Storm拓扑的并行度(parallelism) 49
2.8.1 工作进程、执行器和任务 49
2.8.2 配置拓扑的并行度 50
2.8.3 拓扑示例 51
2.8.4 如何改变运行中拓扑的并行度 52
2.9 Storm命令行客户端 53
2.10 Javadoc文档 57
2.11 本章小结 57
第3章 拓扑详解 59
3.1 什么是拓扑 59
3.2 TopologyBuilder 59
3.3 流分组 61
3.3.1 什么是流分组 61
3.3.2 不同的流分组方式 62
3.4 一个简单的拓扑 66
3.5 在本地模式下运行拓扑 69
3.6 在生产集群上运行拓扑 70
3.6.1 常见的配置 71
3.6.2 杀死拓扑 72
3.6.3 更新运行中的拓扑 72
3.6.4 监控拓扑 72
3.7 拓扑的常见模式 72
3.7.1 流连接(Stream Join) 72
3.7.2 批处理(Batching) 73
3.7.3 BasicBolt 73
3.7.4 内存中缓存与字段的组合 73
3.7.5 流的top N 74
3.7.6 高效保存最近更新缓存对象的TimeCacheMap(已弃用) 76
3.7.7 分布式RPC的CoordinatedBolt与KeyedFairBolt 76
3.8 本地模式与StormSubmitter的对比 76
3.9 多语言协议(Multi-Language Protocol) 78
3.10 使用非JVM语言操作Storm 82
3.10.1 支持的非Java语言 82
3.10.2 对Storm使用非Java语言 82
3.10.3 实现非Java DSL的笔记 82
3.11 Hook 83
3.12 本章小结 84
第4章 组件详解 86
4.1 基本接口 86
4.1.1 IComponent接口 86
4.1.2 ISpout接口 86
4.1.3 IBolt接口 88
4.1.4 IRichSpout与IRichBolt接口 89
4.1.5 IBasicBolt接口 90
4.1.6 IStateSpout与IRichStateSpout接口 90
4.2 基本抽象类 91
4.2.1 BaseComponent抽象类 91
4.2.2 BaseRichSpout抽象类 92
4.2.3 BaseRichBolt抽象类 93
4.2.4 BaseBasicBolt抽象类 93
4.3 事务接口 94
4.3.1 IPartitionedTransactionalSpout 94
4.3.2 IOpaquePartitionedTransactionalSpout 95
4.3.3 ITransactionalSpout 96
4.3.4 ICommitterTransactionalSpout 98
4.3.5 IBatchBolt 98
4.4 组件之间的相互关系 98
4.5 本章小结 100
第5章 Spout详解 102
5.1 可靠的与不可靠的消息 102
5.2 Spout获取数据的方式 104
5.2.1 直接连接(Direct Connection) 105
5.2.2 消息队列(Enqueued Messages) 106
5.2.3 DRPC(分布式RPC) 106
5.3 常用的Spout 107
5.3.1 Kestrel作为Spout的数据源 107
5.3.2 AMQP作为Spout的数据源 107
5.3.3 JMS作为Spout的数据源 107
5.3.4 Redis作为Spout的数据源 108
5.3.5 beanstalkd作为Spout的数据源 108
5.4 学习编写Spout类 108
5.5 本章小结 109
第6章 Bolt详解 111
6.1 Bolt概述 111
6.2 可靠的与不可靠的Bolt 112
6.2.1 使用Anchoring机制实现可靠的Bolt 112
6.2.2 使用IBasicBolt接口实现自动确认 113
6.3 复合流与复合Anchoring 114
6.3.1 复合流 114
6.3.2 复合Anchoring 114
6.4 使用其他语言定义Bolt 114
6.5 学习编写Bolt类 115
6.5.1 可靠的Bolt 115
6.5.2 不可靠的Bolt 116
6.6 本章小结 117
第7章 ZooKeeper详解 119
7.1 ZooKeeper简介 119
7.2 ZooKeeper的下载和部署 119
7.2.1 ZooKeeper的下载 119
7.2.2 ZooKeeper的部署 120
7.3 ZooKeeper的配置 121
7.4 ZooKeeper的运行 123
7.5 ZooKeeper的本地模式实例 125
7.6 ZooKeeper的数据模型 126
7.6.1 ZNode 126
7.6.2 ZooKeeper中的时间 127
7.6.3 ZooKeeper的Stat结构 128
7.7 ZooKeeper的命令行操作范例 128
7.8 Storm在ZooKeeper中的目录结构 131
7.9 本章小结 132
第8章 基础软件的安装与使用 134
8.1 Linux的基本操作 134
8.1.1 环境变量 134
8.1.2 常用命令 135
8.2 JDK的下载与配置 138
8.2.1 Sun JDK的下载 138
8.2.2 在Linux下安装JDK 140
8.2.3 在Windows下安装JDK 141
8.3 GitHub托管项目的下载 146
8.4 Maven的下载与配置 147
8.4.1 Maven的下载 148
8.4.2 在Linux下部署Maven 149
8.4.3 在Windows下部署Maven 149
8.5 其他软件——Notepad++ 151
8.6 本章小结 151
第9章 Storm的安装与配置 153
9.1 Storm集群的安装步骤与准备工作 153
9.1.1 搭建ZooKeeper集群 153
9.1.2 安装Storm的本地依赖 153
9.1.3 下载并解压Storm发行版本 156
9.1.4 配置storm.yaml文件 157
9.1.5 启动Storm的守护进程 159
9.2 本地模式的Storm完整的配置命令 161
9.3 本章小结 162
第10章 Storm集群搭建实践 164
10.1 准备工作 164
10.1.1 概述 164
10.1.2 配置hosts文件 164
10.1.3 配置静态IP 165
10.1.4 集群SSH无密码 166
10.1.5 修改主机名 167
10.1.6 关闭防火墙 168
10.1.7 同步时间 168
10.1.8 安装JDK 168
10.2 ZooKeeper集群的搭建 169
10.2.1 部署第一个节点 169
10.2.2 部署第i个节点 170
10.2.3 启动ZooKeeper集群 171
10.2.4 查看ZooKeeper状态 171
10.2.5 关闭ZooKeeper集群 171
10.2.6 清理ZooKeeper集群 171
10.3 Storm集群的搭建 172
10.3.1 安装Storm依赖(每个Storm节点) 172
10.3.2 部署第一个节点 173
10.3.3 部署第i个节点 174
10.3.4 启动Storm守护进程 174
10.4 本章小结 175
第11章 准备Storm的开发环境 177
11.1 Storm的开发环境 177
11.1.1 什么是Storm的开发环境 177
11.1.2 如何管理Storm 177
11.1.3 如何提交拓扑到集群 181
11.2 Eclipse的下载与配置 182
11.2.1 Eclipse的下载 182
11.2.2 Eclipse的配置与运行 183
11.2.3 Eclipse插件的安装 184
11.3 使用Maven管理项目 186
11.3.1 Maven的下载与配置 186
11.3.2 配置pom.xml文件 186
11.3.3 运行Maven命令 188
11.4 使用Nexus搭建本地Maven私服 188
11.4.1 下载Nexus 189
11.4.2 运行Nexus 189
11.4.3 登录Nexus后台 190
11.4.4 配置Repositories 191
11.4.5 配置setting.xml文件 192
11.4.6 修改Eclipse的Maven插件的配置 194
11.5 使用SVN管理代码版本 195
11.5.1 在Windows下搭建SVN服务器 195
11.5.2 在Linux下搭建SVN服务器 196
11.5.3 安装SVN客户端 197
11.6 部署单节点的Storm集群 197
11.6.1 部署伪分布的ZooKeeper 197
11.6.2 部署伪分布的Storm集群 198
11.7 本章小结 199
第12章 开发自己的Storm应用 201
12.1 新建Maven项目 201
12.2 修改为适合Storm开发的项目 203
12.2.1 对包名进行分类管理 203
12.2.2 修改pom.xml文件 204
12.3 编写代码 206
12.3.1 编写Spout类 206
12.3.2 编写Bolt类 207
12.3.3 编写Topology类 208
12.4 本地测试运行 209
12.5 提交到Storm集群运行 210
12.5.1 使用Maven打包 210
12.5.2 提交jar包到集群 210
12.6 本章小结 211
第13章 storm-starter详解 213
13.1 storm-starter项目概述 213
13.2 storm-starter的下载 215
13.3 使用Maven进行管理 215
13.3.1 使用Maven打包storm-starter 215
13.3.2 使用Maven直接运行WordCountTopology 216
13.3.3 使用Maven运行单元测试 216
13.4 在Eclipse中运行 216
13.4.1 新建Maven项目的方式 216
13.4.2 导入已存在的项目的方式 218
13.5 storm-starter的入门例子 219
13.5.1 ExclamationTopology 219
13.5.2 WordCountTopology 222
13.5.3 ReachTopology 224
13.6 storm-starter的其他例子 230
13.6.1 BasicDRPCTopology 230
13.6.2 ManualDRPC 231
13.6.3 PrintSampleStream 231
13.6.4 RollingTopWords 232
13.6.5 SingleJoinExample 233
13.6.6 TransactionalGlobalCount 234
13.6.7 TransactionalWords 234
13.7 本章小结 235
第14章 研发与集群管理技巧 237
14.1 使用daemontools监控Storm进程 237
14.1.1 daemontools简介 237
14.1.2 安装daemontools 237
14.1.3 编写监控脚本 238
14.2 使用Monit监控Storm 240
14.2.1 Monit简介 240
14.2.2 安装Monit 240
14.2.3 配置Monit 242
14.2.4 启动Monit 244
14.2.5 获取Monit帮助信息 245
14.3 常用的集群操作命令 246
14.4 使用Storm的经验与建议 247
14.5 本章小结 248
第15章 DRPC详解 250
15.1 概述 250
15.2 DRPCTopologyBuilder 251
15.2.1 LinearDRPCTopologyBuilder 251
15.2.2 LinearDRPCTopologyBuilder提供的方法 251
15.2.3 LinearDRPCTopologyBuilder使用范例 252
15.2.4 LinearDRPCTopologyBuilder的工作原理 253
15.2.5 LinearDRPCTopologyBuilder目前已弃用 254
15.3 本地模式的DRPC 254
15.4 远程模式的DRPC 254
15.5 一个复杂的DRPC例子(计算reach值) 255
15.6 非线性DRPC 257
15.7 本章小结 257
第16章 事务拓扑详解 259
16.1 什么是事务拓扑 259
16.1.1 设计1 259
16.1.2 设计2 260
16.1.3 设计3(Storm的设计) 260
16.2 事务拓扑的设计细节 261
16.3 事务拓扑的实现细节 261
16.3.1 事务Spout的工作原理 262
16.3.2 “对于给定的事务id不能发射相同的Batch”的处理 262
16.3.3 更多的细节 264
16.4 事务拓扑API 264
16.4.1 Bolt 264
16.4.2 事务Spout 266
16.4.3 配置 266
16.5 TransactionalTopologyBuilder 267
16.5.1 TransactionalTopologyBuilder提供的方法 267
16.5.2 TransactionalTopologyBuilder类已弃用 270
16.6 一个简单的例子 270
16.7 本章小结 273
第17章 Trident详解 275
17.1 Trident概述 275
17.1.1 简单的例子——单词统计(TridentWordCount) 275
17.1.2 另一个例子——计算Reach值(TridentReach) 278
17.1.3 字段和元组 280
17.1.4 状态(State) 281
17.1.5 Trident拓扑的执行 282
17.2 Trident API 283
17.2.1 概述 283
17.2.2 本地分区操作 283
17.2.3 重新分区操作 288
17.2.4 聚合操作 288
17.2.5 流分组操作 288
17.2.6 合并与连接 289
17.3 Trident的状态 290
17.3.1 Trident状态分类 290
17.3.2 事务Spout(Transactional Spout) 291
17.3.3 不透明事务Spout(Opaque Transactional Spout) 292
17.3.4 非事务Spout(Non-transactional Spout) 294
17.3.5 Spout与State之间的联系 294
17.3.6 State API 294
17.3.7 persistentAggregate方法 298
17.3.8 实现MapStates 299
17.4 Trident Spout 299
17.4.1 流水线(Pipelining) 300
17.4.2 Trident Spout的类型 300
17.5 本章小结 300
第18章 Storm的内部实现 302
18.1 文件系统分析 302
18.2 数据目录结构 303
18.2.1 Nimbus节点的目录结构 303
18.2.2 Supervisor节点的目录结构 304
18.3 代码库的结构 305
18.3.1 storm.thrift 305
18.3.2 Java接口 312
18.3.3 实现 312
18.4 拓扑的生命周期 314
18.4.1 启动拓扑 315
18.4.2 监控拓扑 317
18.4.3 杀死拓扑 317
18.5 Acking框架的实现 318
18.5.1 异或计算的基本原理 318
18.5.2 Acking框架的实现原理 318
18.5.3 Acker的execute方法 319
18.5.4 待定元组(pending tuple)和RotatingMap 319
18.6 Metric 319
18.7 本章小结 325
第19章 Storm相关的其他项目 327
19.1 JStorm项目 327
19.1.1 项目简介 327
19.1.2 下载与部署 328
19.1.3 源代码编译 329
19.2 storm-deploy项目 329
19.3 Storm与Kafka 329
19.3.1 Kafka简介 329
19.3.2 Kafka的安装 330
19.3.3 启动服务 331
19.3.4 测试运行 331
19.3.5 Storm与Kafka的项目 333
19.4 storm-kestrel项目 334
19.4.1 storm-kestrel项目简介 334
19.4.2 使用storm-kestrel项目 334
19.4.3 Kestrel服务器和队列 335
19.4.4 添加元素到kestrel 336
19.4.5 从Kestrel中移除元素 336
19.4.6 持续添加元素到Kestrel 337
19.4.7 使用KestrelSpout 338
19.4.8 执行 339
19.5 本章小结 339
第20章 企业应用案例 341
20.1 Storm席卷众多互联网企业 341
20.1.1 Storm的典型应用场景 341
20.1.2 Storm的三大基本应用 341
20.2 Storm在Twitter中的应用 342
20.2.1 Twitter公司简介 342
20.2.2 Storm帮助Twitter提升产品性能 343
20.2.3 MapR在Twitter中的应用简介 343
20.3 Storm在阿里巴巴集团的应用 344
20.3.1 阿里巴巴集团简介 345
20.3.2 Storm在阿里巴巴的应用 345
20.3.3 Storm在淘宝公司的应用 346
20.3.4 Storm在支付宝公司的应用 347
20.4 其他应用Storm的知名企业和项目 347
20.5 本章小结 363
参考资料 364