第I部分 初识流系统 1
第1章 欢迎阅读《流计算系统图解》 3
1.1 什么是流处理 4
1.2 流系统的例子 5
1.3 流系统和实时性 6
1.4 流系统的工作方式 7
1.5 应用程序 8
1.6 后台服务 9
1.7 后台服务的内部实现 10
1.8 批处理系统 11
1.9 批处理系统内部 12
1.10 流处理系统 13
1.11 流处理系统的内部实现 14
1.12 多阶段架构的优势 15
1.13 批处理和流处理系统中的多阶段架构 16
1.13.1 批处理系统 16
1.13.2 流处理系统 16
1.14 比较这些系统 17
1.15 一个典型的流处理系统 18
1.16 小结 19
1.17 练习 19
第2章 你好,流系统 21
2.1 老板需要一个高级收费站 22
2.2 失败案例:使用HTTP请求实现服务 23
2.3 AJ 和 Miranda 对失败的反思 24
2.4 AJ 对流系统的思考 25
2.5 比较后端服务和流 26
2.5.1 后端服务:一个同步模型 26
2.5.2 流:异步模型 26
2.6 流系统如何适用于当前场景 27
2.7 基本概念:队列 28
2.8 通过队列传输数据 29
2.9 初探流框架Streamwork 30
2.10 Streamwork 框架概述 31
2.11 深入 Streamwork 的引擎 32
2.12 流的核心概念 33
2.13 相关概念的更多细节 34
2.14 流作业的执行流程 35
2.15 你的第一个流作业 36
2.15.1 你的第一个流作业:创建事件类 36
2.15.2 你的第一个流作业:数据源 37
2.15.3 你的第一个流作业:数据源(续) 38
2.15.4 你的第一个流作业:算子 39
2.15.5 你的第一个流作业:算子(续) 40
2.15.6 你的第一个流作业:构建作业 41
2.16 执行作业 42
2.17 检查作业执行情况 43
2.18 深入了解处理引擎 44
2.18.1 深入了解引擎:源执行器 45
2.18.2 深入了解引擎:算子执行器 46
2.18.3 深入了解引擎:作业启动器 47
2.19 事件的流转 48
2.20 数据元素的生命周期 49
2.21 回顾流概念 50
2.22 小结 51
2.23 练习 51
第3章 并行化和数据分组 53
3.1 传感器正在生成更多的事件 54
3.2 即使在流中,实时处理也很难 55
3.3 新概念:并行很重要 56
3.4 新概念:数据并行 57
3.5 新概念:数据执行的独立性 58
3.6 新概念:任务并行 59
3.7 数据并行与任务并行 60
3.8 并行与并发 61
3.9 作业的并行化 62
3.10 组件的并行化 63
3.11 数据源的并行化 64
3.12 查看作业输出 65
3.13 算子并行化 66
3.14 再次查看作业输出 67
3.15 事件和实例 68
3.16 事件顺序 69
3.17 事件分组 70
3.18 随机分组 71
3.19 随机分组原理 72
3.20 字段分组 73
3.21 字段分组原理 74
3.22 事件的分组执行 75
3.23 深入了解引擎:事件分发器 76
3.24 在作业中采用字段分组 77
3.25 查看事件顺序 78
3.26 比较分组行为 79
3.27 小结 80
3.28 练习 80
第4章 流中的图 81
4.1 信用卡欺诈检测系统 82
4.2 信用卡欺诈检测系统的更多细节 83
4.3 欺诈检测业务流程 84
4.4 流并不总是一条直线 85
4.5 系统内部分析 86
4.6 欺诈检测作业的细节 87
4.7 新概念 88
4.8 上下游组件 89
4.9 流的扇出和扇入 90
4.10 图、有向图以及有向无环图 91
4.11 流处理系统中的 DAG 92
4.12 新概念概览 93
4.13 从流扇出到分析器 94
4.14 深入了解引擎 95
4.15 有一个问题: 效率 96
4.16 不同流的扇出 97
4.17 再次深入了解引擎 98
4.18 使用通道实现组件间通信 99
4.19 多个通道 100
4.20 流扇入至评分聚合器 101
4.21 引擎中的流扇入 102
4.22 对另一个流扇入的简单介绍:Join 103
4.23 回顾整个系统 104
4.24 图和流作业 105
4.25 示例系统 106
4.26 小结 107
4.27 练习 108
第5章 送达语义 109
5.1 欺诈检测系统的延迟需求 110
5.2 重新审视欺诈检测作业 111
5.3 关于准确性 112
5.4 部分结果 113
5.5 一个监控系统使用率的流作业 114
5.6 新系统使用率作业 115
5.7 新系统使用率作业的需求 116
5.8 新概念:送达次数和处理次数 117
5.9 新概念:送达语义 118
5.10 选择正确的语义 119
5.11 至多一次送达 120
5.12 欺诈检测作业 121
5.12.1 好的一面 121
5.12.2 坏的一面 121
5.12.3 希望 121
5.13 至少一次送达 122
5.14 用确认机制实现至少一次送达 123
5.15 跟踪事件 124
5.16 应对事件处理时的失败 125
5.17 追踪提早结束处理的事件 126
5.18 组件中关于确认的代码 127
5.19 新概念:检查点 128
5.20 新概念:状态 129
5.21 在系统使用率作业中为至少一次送达语义生成检查点 130
5.22 生成检查点和状态操作函数 131
5.23 交易源组件中的状态处理代码 132
5.24 恰好一次还是实际一次 133
5.25 额外概念:幂等操作 134
5.26 恰好一次送达 135
5.27 系统使用率分析器组件中的状态处理代码 136
5.28 再次比较送达语义 137
5.29 小结 138
5.30 练习 138
5.31 接下来 139
第6章 流系统回顾与展望 141
6.1 流系统的基本概念 142
6.2 并行化和事件分组 143
6.3 有向无环图和流作业 144
6.4 送达语义(送达保证) 145
6.5 在信用卡欺诈检测系统中使用的送达语义 146
6.6 接下来是什么 147
6.7 窗口计算简介 148
6.8 实时Join数据 149
6.9 反压简介 150
6.10 无状态计算和有状态计算 151
第II部分 进阶 153
第7章 窗口计算 155
7.1 对实时数据进行切分 156
7.2 详细分解问题 157
7.3 继续分解问题 158
7.4 两种上下文 159
7.5 欺诈检测中的窗口处理 160
7.6 窗口究竟是什么 161
7.7 进一步了解窗口 162
7.8 新概念:窗口策略 163
7.9 固定窗口 164
7.10 距离分析器中的固定窗口 165
7.11 用固定时间窗口检测欺诈行为 166
7.12 固定窗口:时间与数量 167
7.13 滑动窗口 168
7.14 滑动窗口与距离分析器 169
7.15 用滑动窗口检测欺诈行为 170
7.16 会话窗口 171
7.17 会话窗口(续) 172
7.18 使用会话窗口检测欺诈行为 173
7.19 窗口化策略的总结 174
7.20 将事件流切成数据集 175
7.21 窗口:概念与实现 176
7.22 回顾 177
7.23 键值存储入门 178
7.24 实现窗口化距离分析器 179
7.25 事件时间和事件的其他时间 180
7.26 窗口水位 181
7.27 迟到事件 182
7.28 小结 183
7.29 练习 184
第8章 Join 操作 185
8.1 即时 Join 排放量数据 186
8.2 排放量作业初版 187
8.3 排放量解析器 188
8.4 准确性是个问题 189
8.5 排放量作业增强版 190
8.6 聚焦 Join 191
8.7 到底什么是 Join 192
8.8 流 Join是如何工作的 193
8.9 流式 Join 是一种不同的扇入方式 194
8.10 车辆事件与温度事件 195
8.11 表:流的物化视图 196
8.12 物化车辆事件更低效 197
8.13 数据完整性问题 198
8.14 这个 Join 算子的问题出在哪 199
8.15 Inner Join 200
8.16 Outer Join 201
8.17 Inner Join 与 Outer Join 202
8.18 不同类型的 Join 203
8.19 流系统中的 Outer Join 204
8.20 新问题:网络连接 205
8.21 窗口 Join 206
8.22 两表 Join 而不是流表 Join 207
8.23 重新审视物化视图 208
8.24 小结 209
第9章 反压 211
9.1 可靠性很关键 212
9.2 回顾系统 213
9.3 精简的流作业 214
9.4 新概念:容量、利用率和空余率 215
9.5 进一步了解利用率与空余率 216
9.6 新概念:反压 217
9.7 测量容量利用率 218
9.8 Streamwork引擎中的反压 219
10.18 有状态组件与无状态组件 253
10.19 手动管理实例状态 254
10.20 Lambda架构 255
10.21 小结 256
10.22 练习 257
第11章 总结:流系统中的高级概念 259
11.1 真的结束了吗 260
11.2 窗口计算回顾 261
11.3 主要窗口类型回顾 262
11.3.1 固定窗口 262
11.3.2 滑动窗口 262
11.3.3 会话窗口 262
11.4 实时 Join 数据回顾 263
11.5 SQL与流式 Join回顾 264
11.6 Inner Join 和 Outer Join回顾 265
11.7 流系统中的意外情况 266
11.8 反压:减慢数据源或上游组件的速度 267
11.8.1 停止数据源 267
11.8.2 停止上游组件 267
11.9 另一种处理滞后实例的方法:丢弃事件 268
11.10 反压可能只是内部问题的表象 269
11.10.1 实例停止工作,所以反压不会得到缓解 269
11.10.2 实例无法赶上进度,反压将反复触发:抖动 269
11.11 带有检查点的有状态组件 270
11.12 基于事件的计时 271
11.13 有状态组件与无状态组件回顾 272
11.14 你做到了 273
11.14.1 挑选一个开源项目来学习 273
11.14.2 开始写博客,传授你所学的知识 273
11.14.3 参加聚会和会议 273
11.14.4 参与开源项目 273
11.14.5 永不放弃 273