第1章 大数据的新范式 1
1.1 本书是如何组织的 2
1.2 扩展传统数据库 3
1.2.1 用队列扩展 3
1.2.2 通过数据库分片进行扩展 4
1.2.3 开始处理容错问题 4
1.2.4 损坏问题 5
1.2.5 到底是哪里出错了 5
1.2.6 大数据技术是如何起到帮助作用的 5
1.3 NoSQL不是万能的 6
1.4 基本原理 6
1.5 大数据系统应有的属性 7
1.5.1 鲁棒性和容错性 7
1.5.2 低延迟读取和更新 8
1.5.3 可扩展性 8
1.5.4 通用性 8
1.5.5 延展性 8
1.5.6 即席查询 9
1.5.7 最少维护 9
1.5.8 可调试性 9
1.6 全增量架构的问题 10
1.6.1 操作复杂性 10
1.6.2 实现最终一致性的极端复杂性 11
1.6.3 缺乏容忍人为错误 12
1.6.4 全增量架构解决方案与Lambda架构解决方案 13
1.7 Lambda架构 14
1.7.1 批处理层 15
1.7.2 服务层 16
1.7.3 批处理层和服务层满足几乎所有属性 16
1.7.4 速度层 17
1.8 技术上的最新趋势 19
1.8.1 CPU并不是越来越快 20
1.8.2 弹性云 20
1.8.3 大数据充满活力的开源生态系统 20
1.9 示例应用:SuperWebAnalytics.com 21
1.10 总结 22
第一部分 批处理层 24
第2章 大数据的数据模型 24
2.1 数据的属性 25
2.1.1 数据是原始的 28
2.1.2 数据是不可变的 30
2.1.3 数据是永远真实的 33
2.2 基于事实的数据表示模型 34
2.2.1 事实的示例及属性 34
2.2.2 基于事实的模型的优势 36
2.3 图模式 39
2.3.1 图模式的元素 39
2.3.2 可实施模式的必要性 40
2.4 SuperWebAnalytics.com的完整数据模型 41
2.5 总结 42
第3章 大数据的数据模型:示例 44
3.1 为什么使用序列化框架 44
3.2 Apache Thrift 45
3.2.1 节点 46
3.2.2 边 46
3.2.3 属性 47
3.2.4 把一切组合成数据对象 47
3.2.5 模式演变 48
3.3 序列化框架的局限性 49
3.4 总结 50
第4章 批处理层的数据存储 51
4.1 主数据集的存储需求 52
4.2 为批处理层选择存储方案 53
4.2.1 使用键/值存储主数据集 53
4.2.2 分布式文件系统 54
4.3 分布式文件系统是如何工作的 54
4.4 使用分布式文件系统存储主数据集 56
4.5 垂直分区 58
4.6 分布式文件系统的底层性质 58
4.7 在分布式文件系统上存储SuperWebAnalytics.com的主数据集 60
4.8 总结 61
第5章 批处理层的数据存储:示例 62
5.1 使用HDFS 62
5.1.1 小文件问题 64
5.1.2 转向更高层次的抽象 64
5.2 使用Pail在批处理层存储数据 65
5.2.1 Pail基本操作 66
5.2.2 序列化对象到Pail中 67
5.2.3 使用Pail进行批处理操作 69
5.2.4 使用Pail进行垂直分区 69
5.2.5 Pail文件格式与压缩 71
5.2.6 Pail优点的总结 71
5.3 存储SuperWebAnalytics.com的主数据集 72
5.3.1 Thrift对象的结构化Pail 73
5.3.2 SuperWebAnalytics.com的基础Pail 74
5.3.3 用于垂直分区数据集的分片Pail 75
5.4 总结 78
第6章 批处理层 79
6.1 启发性示例 80
6.1.1 给定时间范围内的页面浏览量 80
6.1.2 性别推理 80
6.1.3 影响力分数 81
6.2 批处理层上的计算 82
6.3 重新计算算法与增量算法 84
6.3.1 性能 85
6.3.2 容忍人为错误 86
6.3.3 算法的通用性 86
6.3.4 选择算法的风格 87
6.4 批处理层中的可扩展性 87
6.5 MapReduce:一种大数据计算的范式 88
6.5.1 可扩展性 89
6.5.2 容错性 91
6.5.3 MapReduce的通用性 92
6.6 MapReduce的底层特性 94
6.6.1 多步计算很怪异 94
6.6.2 手动实现连接非常复杂 94
6.6.3 逻辑和物理执行紧密耦合 96
6.7 管道图——一种关于批处理计算的高级思维方式 97
6.7.1 管道图的概念 97
6.7.2 通过MapReduce执行管道图 101
6.7.3 合并聚合器 101
6.7.4 管道图示例 102
6.8 总结 103
第7章 批处理层:示例 104
7.1 一个例证 105
7.2 数据处理工具的常见陷阱 106
7.2.1 自定义语言 107
7.2.2 不良的可组合抽象 107
7.3 JCascalog介绍 108
7.3.1 JCascalog的数据模型 109
7.3.2 JCascalog查询的结构 110
7.3.3 查询多个数据集 111
7.3.4 分组和聚合器 113
7.3.5 对一个查询示例进行单步调试 114
7.3.6 自定义谓词操作 117
7.4 组合 121
7.4.1 合并子查询 122
7.4.2 动态创建子查询 123
7.4.3 谓词宏 125
7.4.4 动态创建谓词宏 128
7.5 总结 130
第8章 批处理层示例:架构和算法 131
8.1 SuperWebAnalytics.com批处理层的设计 132
8.1.1 所支持的查询 132
8.1.2 批处理视图 132
8.2 工作流概述 135
8.3 获取新数据 137
8.4 URL规范化 137
8.5 用户标识符规范化 138
8.6 页面浏览去重 142
8.7 计算批处理视图 142
8.7.1 给定时间范围内的页面浏览量 143
8.7.2 给定时间范围内的独立访客 143
8.7.3 跳出率分析 144
8.8 总结 145
第9章 批处理层示例:实现 147
9.1 出发点 147
9.2 准备工作流 148
9.3 获取新数据 149
9.4 URL规范化 152
9.5 用户标识符规范化 153
9.6 页面浏览去重 159
9.7 计算批处理视图 159
9.7.1 给定时间范围内的页面浏览量 159
9.7.2 给定时间范围内的独立访客 161
9.7.3 跳出率分析 163
9.8 总结 165
第二部分 服务层 168
第10章 服务层概述 168
10.1 服务层的性能指标 169
10.2 规范化/非规范化问题的服务层解决方案 172
10.3 服务层数据库的需求 173
10.4 设计SuperWebAnalytics.com的服务层 174
10.4.1 给定时间范围内的页面浏览量 175
10.4.2 给定时间范围内的独立访客 175
10.4.3 跳出率分析 176
10.5 对比全增量的解决方案 177
10.5.1 给定时间范围内的独立访客的全增量方案 177
10.5.2 与Lambda架构解决方案的比较 182
10.6 总结 183
第11章 服务层:示例 184
11.1 ElephantDB的基本概念 184
11.1.1 ElephantDB中的视图创建 185
11.1.2 ElephantDB中的视图服务 185
11.1.3 使用ElephantDB 186
11.2 创建SuperWebAnalytics.com的服务层 188
11.2.1 给定时间范围内的页面浏览量 188
11.2.2 给定时间范围内的独立访客数量 191
11.2.3 跳出率分析 191
11.3 总结 192
第三部分 速度层 194
第12章 实时视图 194
12.1 计算实时视图 195
12.2 存储实时视图 197
12.2.1 最终一致性 198
12.2.2 速度层中存储的状态总量 198
12.3 增量计算的挑战 199
12.3.1 CAP原理的有效性 199
12.3.2 CAP原理和增量算法之间复杂的相互作用 201
12.4 异步更新与同步更新 202
12.5 过期实时视图 203
12.6 总结 205
第13章 实时视图:示例 206
13.1 Cassandra的数据模型 206
13.2 使用Cassandra 208
13.3 总结 210
第14章 队列和流处理 211
14.1 队列 211
14.1.1 单消费者队列 212
14.1.2 多消费者队列 214
14.2 流处理 214
14.2.1 队列和工作节点 215
14.2.2 队列和工作节点的缺陷 216
14.3 更高层次的一次一个的流处理 217
14.3.1 Storm模型 217
14.3.2 保证消息处理 221
14.4 SuperWeb.Analytics.com速度层 223
14.5 总结 226
第15章 队列和流处理:示例 227
15.1 使用ApacheStorm定义拓扑结构 227
15.2 Apache Storm集群及其部署 230
15.3 保证消息处理 232
15.4 实现SuperWebAnalytics.com给定时间范围内的独立访客的速度层 233
15.5 总结 237
第16章 微批量流处理 239
16.1 实现有且仅有一次语义 240
16.1.1 强有序处理 240
16.1.2 微批量流处理 241
16.1.3 微批量流处理的拓扑结构 242
16.2 微批量流处理的核心概念 244
16.3 微批量流处理的扩展管道图 245
16.4 完成SuperWebAnalytics.com的速度层 246
16.4.1 给定时间范围内的页面浏览量 246
16.4.2 跳出率分析 247
16.5 另一个跳出率分析示例 251
16.6 总结 252
第17章 微批量流处理:示例 253
17.1 使用Trident 253
17.2 完成SuperWebAnalytics.com的速度层 257
17.2.1 给定时间范围内的页面浏览量 257
17.2.2 跳出率分析 259
17.3 完全容错、基于内存及微批量处理 265
17.4 总结 266
第18章 深入Lambda架构 268
18.1 定义数据系统 268
18.2 批处理层和服务层 270
18.2.1 增量的批处理 270
18.2.2 测量和优化批处理层的资源使用 276
18.3 速度层 280
18.4 查询层 281
18.5 总结 282