目 录 Contents
前 言
基 础 篇
第1章 认识Storm 2
1.1 什么是实时流计算 2
1.1.1 实时流计算背景 3
1.1.2 实时计算应用场景 3
1.1.3 实时计算处理流程 4
1.1.4 实时计算框架 5
1.2 Storm是什么 11
1.2.1 Storm出现的背景 12
1.2.2 Storm简介 12
1.2.3 Storm的设计思想 13
1.2.4 Storm与Hadoop的角色和组件比较 14
1.3 Storm核心组件 15
1.3.1 主节点Nimbus 15
1.3.2 工作节点Supervisor 15
1.3.3 协调服务组件ZooKeeper 16
1.3.4 其他核心组件 16
1.4 Storm的特性 16
1.5 Storm的功能 18
1.6 本章小结 19
第2章 开始使用Storm 20
2.1 环境准备 20
2.1.1 系统配置 20
2.1.2 安装ZooKeeper集群 22
2.2 启动模式 26
2.2.1 本地模式 26
2.2.2 分布式模式 26
2.3 安装部署Storm集群 26
2.3.1 安装Storm依赖库 27
2.3.2 安装Storm集群 28
2.3.3 启动Storm集群 31
2.3.4 停止Storm集群 33
2.4 创建Topology并向集群提交任务 33
2.4.1 创建Topology 34
2.4.2 向集群提交任务 36
2.5 本章小结 36
第3章 核心概念和数据流模型 37
3.1 Tuple元组 37
3.1.1 Tuple描述 37
3.1.2 Tuple的生命周期 38
3.2 Spout数据源 39
3.2.1 Spout介绍 39
3.2.2 Spout实例 40
3.3 Bolt消息处理者 42
3.3.1 Bolt介绍 42
3.3.2 Bolt实例 45
3.4 Topology拓扑 47
3.4.1 Topology实例 48
3.4.2 Topology运行 51
3.5 Stream消息流和Stream Grouping消息流组 55
3.5.1 Stream消息流 55
3.5.2 Stream Grouping消息流组 55
3.6 Task任务 56
3.7 Worker工作者进程 56
3.8 Worker、Task、Executor三者之间的关系 57
3.9 事务 57
3.10 数据流模型 58
3.10.1 数据流模型简介 58
3.10.2 Storm数据流模型 60
3.11 本章小结 61
实 战 篇
第4章 实例1:移动互联——语音“实时墙” 64
4.1 业务背景 64
4.1.1 案例背景 64
4.1.2 设计目标 65
4.1.3 数据格式 66
4.1.4 硬件配置 68
4.2 系统架构与模块设计 68
4.2.1 整体架构 69
4.2.2 数据采集 70
4.2.3 数据实时处理 70
4.2.4 存储设计 70
4.2.5 Web实时展示 71
4.2.6 硬件部署图 72
4.3 核心模块实现 73
4.3.1 实时处理业务逻辑实现 73
4.3.2 Web展示实现 80
4.3.3 最终效果呈现 88
4.4 本章小结 89
第5章 实例2:运营商——网络流量流向实时分析 90
5.1 业务背景 90
5.1.1 案例背景 91
5.1.2 设计目标 91
5.1.3 数据规模预估 92
5.1.4 数据格式 92
5.1.5 统计分析需求 93
5.2 系统架构与模块设计 94
5.2.1 整体架构 94
5.2.2 数据源 95
5.2.3 日志采集 96
5.2.4 数据存储 96
5.2.5 数据处理 97
5.2.6 目标存储和扩展服务 97
5.2.7 结果Web展示 97
5.3 核心模块实现 98
5.3.1 模拟数据实现 98
5.3.2 日志采集和存储实现 102
5.3.3 数据处理实现 105
5.3.4 Web展示实现 111
5.4 本章小结 114
第6章 实例3:交通——基于GPS的实时路况分析 115
6.1 业务背景 115
6.1.1 案例背景 115
6.1.2 设计目标 116
6.1.3 数据格式 118
6.1.4 实时路况分析方法 118
6.2 系统架构和模块设计 118
6.3 核心模块的实现 121
6.3.1 安装Kafka集群 121
6.3.2 Flume整合Kafka 124
6.3.3 实时处理数据 125
6.3.4 Web页面展示 127
6.4 本章小结 129
第7章 实例4:互联网——数据质量实时监控 130
7.1 业务背景 130
7.1.1 案例背景 130
7.1.2 设计目标 132
7.1.3 数据格式 132
7.2 系统架构与模块设计 133
7.2.1 整体架构 133
7.2.2 结果Web展示 135
7.3 核心模块实现 135
7.3.1 模拟数据 135
7.3.2 实时处理业务逻辑的实现 141
7.3.3 Web界面实现 147
7.3.4 最终效果图 150
7.4 本章小结 152
第8章 实例5:交通——超速频发路段监控 153
8.1 业务背景 153
8.1.1 案例背景 153
8.1.2 数据类型 155
8.2 系统架构和模块设计 157
8.3 核心模块实现 158
8.3.1 实现入口类Main 158
8.3.2 数据源SocketSpout的实现 159
8.3.3 实时处理MapSearchBolt和SpeedProcessBolt的实现 161
8.3.4 目标存储DataBaseLoadBolt的实现 169
8.4 本章小结 171
第9章 实例6:互联网——广告实时流量统计 172
9.1 广告实时流量统计系统架构 172
9.1.1 广告数据 172
9.1.2 详细需求描述 174
9.1.3 系统架构 175
9.2 表结构与模块设计 177
9.2.1 表结构设计 177
9.2.2 功能模块设计 178
9.3 核心模块实现 179
9.3.1 部署物理集群环境 179
9.3.2 Kafka生产者逻辑的实现 181
9.3.3 使用Stormkafka实现业务逻辑 182
9.3.4 使用HBase存储并实现统计 193
9.4 本章小结 194
技 巧 篇
第10章 Storm常见故障及解决方法 196
10.1 安装部署故障 196
10.1.1 “no jzmq in java.library.path”异常 196
10.1.2 “No rule to make target”异常 198
10.1.3 “cannot access org.zeromq.ZMQ”异常 198
10.1.4 缺少pkgconf?ig异常 198
10.1.5 “java.lang.Unsatisf?iedLinkError”异常 199
10.1.6 “java.lang.NoClassDefFoundError:clojure.core.protocols$”异常 199
10.1.7 “Error:cannot link with luuid,install uuiddev”异常 199
10.1.8 “bad interpreter:No such f?ile or directory”异常 200
10.1.9 “org.zeromq.ZMQException:Invalid argument”异常 200
10.2 启动故障 201
10.2.1 “java.io.FileNotFoundException”异常 201
10.2.2 “java.io.EOFException”异常 202
10.3 运行时故障 202
10.3.1 “Nimbus host is not set”异常 203
10.3.2 “AlreadyAliveException(msg:xxx is alreadyactive)”异常 203
10.3.3 无法序列化log4j.Logger异常 203
10.3.4 “Failing message”异常 203
10.3.5 “java.io.NotSerializableException”异常 204
10.3.6 “java.lang.NoClassDefFoundError”异常 205
10.3.7 “java.net.NoRouteToHostException”异常 206
10.3.8 “java.net.UnknownHostException”异常 206
10.3.9 重复defaults.yaml资源文件异常 207
10.3.10 “KeeperException$NoNodeException”异常 208
10.3.11 “A fatal error has been detected by the Java Runtime Environment”错误 209
10.3.12 “java.lang.ArrayIndexOutOfBoundsException”异常 212
10.3.13 DRPC空指针异常 212
10.3.14 Storm Thrift读取数据报错 212
10.4 本章小结 214
第11章 Storm使用技巧和最佳实践 215
11.1 核心组件使用要点 215
11.1.1 Spout和Bolt 215
11.1.2 ZooKeeper集群尽量独立 219
11.1.3 Thrift服务的应用场景 220
11.1.4 序列化机制的使用场景 220
11.2 集群配置技巧 220
11.2.1 默认参数配置 220
11.2.2 日志信息 223
11.2.3 合理配置JVM参数 223
11.3 集群运维技巧 224
11.3.1 Storm计算结果的存储位置 224
11.3.2 Storm集群动态增删节点 224
11.3.3 关闭Storm相关进程 224
11.3.4 Storm UI显示内容的问题 224
11.4 项目开发技巧 225
11.4.1 使用assembly插件打包 225
11.4.2 依赖JAR冲突 228
11.5 保证消息的可靠处理 228
11.5.1 消息失败后的处理 228
11.5.2 主动干预可靠性 229
11.5.3 处理重复的Tuple 229
11.6 理解DRPC原语 230
11.6.1 DRPC工作流 230
11.6.2 LinearDRPCTopologyBuilder实现类 231
11.6.3 DRPC的两种模式 231
11.7 快速理解一致性事务 232
11.7.1 Trident框架的使用 233
11.7.2 Trident框架的细节 234
11.7.3 事务性Spout 236
11.7.4 状态State 238
11.8 本章小结 241