猜你喜欢
流计算系统图解

流计算系统图解

书籍作者:乔什·费舍尔 ISBN:9787302634652
书籍语言:简体中文 连载状态:全集
电子书格式:pdf,txt,epub,mobi,azw3 下载次数:8416
创建日期:2024-04-16 发布日期:2024-04-16
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板
内容简介
流计算系统尽可能地优化了接收处理事件数据的间隔时间,因此能实时地提供响应。对于金融、安全和物联网领域的应用来说,几毫秒都很关键,因此流计算系统是必要组件。而且,流计算是热门技术 具有Spark、Heron和Kafka经验的工程师供不应求。
  《流计算系统图解》以浅显易懂的语言介绍了实时事件流应用。这本引人入胜的书阐明了数据并行化、事件窗口和反压等核心概念,让你不会被框架的具体细节所困扰。在学习过程中,你将从头开始构建一个简单的流计算工具,以确保深入领会各种理念和技术。当你读到实时信用卡欺诈检测和IoT监控服务等示例时,实用且有趣的插图使流计算系统显得更加生动。
  主要内容
  实现流计算系统以及故障排除
  为复杂功能设计流计算系统
  定位网络瓶颈并解决反压问题
  为高性能系统对数据进行分组
  阅读门槛
  读者不需要流系统的相关经验。书中示例代码使用Java语言。
作者简介

Josh Fischer 目前是 1904labs 的团队负责人,他曾为其他组织 ( 如孟山都和拜耳 )构建大规模实时数据应用。他是 Apache 委员会成员,也是 Apache Heron 分布式流处理引擎项目管理委员会的成员。


王宁现在是 Amplitude 的软件工程师,负责实时数据管道的构建。他是 Twitter 实时计算团队中 Apache Heron 的关键贡献者。


前言

在我技术职业生涯的初期,一位同事曾经对我说:“如果有一件事能改变你的职业生涯,那就是参与开源项目。”这些年来,我的脑海中一直酝酿着这个想法,但从来没有理由这样做。我想:“我可以创造什么对别人有用的东西呢?” 在1904labs工作时,我为(当时的)Twitter Heron开发了ECO API。它来自客户的需求——也来自一点点私心,我真的很想编写和贡献这些代码。最终,Twitter把Heron捐赠给了Apache基金会,我受邀成为Heron的提交者和项目管理委员会的一员。这个项目令我兴趣十足,因为它是我深入参与的首个开源项目。

从某个星期一下午4点左右在Heron主分支上的初始提交开始算起,大约一年后,我收到了一封标题为“Apache Heron图书或课程项目”的来自Eleonor Gardner的邮件。在浏览一遍后,我以为它是个恶作剧,竟差点丢弃了这封邮件。毕竟,怎么会有人想让我写书或讲解课程项目?当然,事实证明我错了。与Manning的副发行人Mike Stephens进行了一番讨论,并与他的助手Eleonor互发了几封电子邮件之后,我知道我需要一些帮助才能完成这件事。我联系了我的朋友、在Apache Heron的同事王宁,希望他有兴趣和我一起写书。幸运的是,他有兴趣——这就是这场漫长而收获颇丰的旅程的开端。

最初,我们商议写一本关于Heron的书。但是王宁有些更棒的想法,毕竟技术变化很快,软件的突破性变化会使一本书迅速过时。因此,我们希望书的主题超出某个特定的流计算框架的范畴。我们达成共识:这本书应当与框架无关,读者应当能在读完之后去学习使用任何流计算框架。

我们一开始只用文字来写书,然后王宁和我被“温柔”地引导去尝试另一种方式。一次又一次,再一次,再一次,我们终于充分领悟到,图表能让书中的内容更容易被读者吸收。我们用钢笔在纸上绘制了第一张图(见图a),它看起来很差劲。

图a 绘制的第一张图

在成书过的程中,那些看起来很原始、潦草的创作最终演变成了你现在在书中所看到的图表。王宁和我设计并完善了所有这些图表。我们对自己的创作感到非常自豪,希望你也能看到这本书的价值。

Josh Fischer

2021年11月


目录

第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


短评

流计算系统图解 随着大数据时代的到来,数据处理变得更加复杂和实时。传统的批处理处理方式已经无法满足实时数据处理的需求。为了解决这一问题,流计算系统应运而生。本文将介绍流计算系统的基本概念,并通过图解方式来解释其工作原理和应用场景。 ## 什么是流计算系统? 流计算系统是一种用于实时数据处理的计算框架。它可以接收连续产生的数据流,并实时处理这些数据,以便快速生成有价值的结果。与传统的批处理不同,流计算系统能够在数据到达时立即处理,无需等待数据积累到一定数量或时间间隔。 ## 流计算系统的核心组件 流计算系统通常由以下核心组件构成: 1. **数据源**:数据源是流计算的输入,可以是传感器数据、日志文件、网络流量等等。数据源将不断产生数据并发送给流计算系统。 2. **流处理引擎**:流处理引擎是流计算系统的核心部分,负责接收、处理和分析数据流。它能够处理数据的窗口化、过滤、聚合等操作。 3. **计算逻辑**:计算逻辑定义了对数据流的实际处理过程。这可以是一些计算、过滤、转换等操作,根据业务需求定制。 4. **结果存储**:流计算系统通常需要将处理结果存储在数据库、数据仓库或其他存储系统中,以供后续分析和查询使用。 5. **输出**:处理后的数据可以被输出到不同的目标,如仪表盘、报表、其他应用程序等。 ## 流计算系统的工作原理 下面我们通过一个简单的图解来说明流计算系统的工作原理: ![流计算系统工作原理](https://www.example.com/stream-processing.png) 1. **数据源**:数据源连续不断地生成数据,并将其发送给流计算系统。 2. **流处理引擎**:流处理引擎接收数据流,并根据预定义的计算逻辑进行处理。它可以设置不同的窗口,比如滚动窗口、滑动窗口等,来控制数据的处理方式。 3. **计算逻辑**:计算逻辑定义了如何处理数据流。例如,可以对数据进行聚合、过滤或转换操作,以生成有用的结果。 4. **结果存储**:处理后的结果通常被存储在数据库或其他存储系统中,以便后续查询和分析。 5. **输出**:最终的处理结果可以被输出到仪表盘、报表或其他应用程序中,供用户查看和使用。 ## 流计算系统的应用场景 流计算系统在各个领域都有广泛的应用,以下是一些常见的应用场景: 1. **实时监控和警报**:流计算系统可以用于监控设备、应用程序或网络流量,及时发现并警报异常情况。 2. **金融交易分析**:金融领域需要实时处理大量的交易数据,流计算系统可以用于实时风险管理和市场分析。 3. **物联网(IoT)数据处理**:物联网设备产生的数据通常是连续流,流计算系统可以用于实时分析和控制。 4. **广告投放**:在线广告需要实时决策,根据用户的行为和偏好来选择最合适的广告,流计算系统可以帮助实现这一目标。 5. **日志分析**:流计算系统可以用于实时监控和分析应用程序和系统的日志,以便快速发现和解决问题。 ## 结论 流计算系统是处理实时数据的重要工具,它能够帮助组织更好地理解和利用实时数据流。通过图解方式,我们简要介绍了流计算系统的核心组件和工作原理,并探讨了其应用场景。随着技术的不断发展,流计算系统将在更多领域发挥关键作用,推动实时数据处理的进一步创新和发展。

2023-09-04 10:12:11