本书的主角是在大数据时代应运而生的数据处理与分析利器Spark。你将通过丰富的示例学习如何使用Spark的结构化数据API,利用Spark SQL进行交互式查询,掌握Spark应用的优化之道,用Spark和Delta Lake等开源工具构建可靠的数据湖,并用MLlib库实现机器学习流水线。随着Spark从2.x版本升级到3.0版本,本书第2版做了全面的更新,以体现Spark生态系统在机器学习、流处理技术等方面的发展,另新增一章详解Spark 3.0引入的新特性。
【作者简介】 朱尔斯·S. 达米吉(Jules S. Damji)是Databricks的高级开发人员,也是MLflow的贡献者。 布鲁克·韦尼希(Brooke Wenig)是Databricks的机器学习专家。 泰瑟加塔·达斯(Tathagata Das)是Databricks的软件工程师,也是Apache Spark PMC成员。 丹尼·李(Denny Lee)是Databricks的软件工程师。 【译者简介】 王道远 目前就职于阿里云开源大数据平台数据湖存储团队,花名健身,主要负责数据湖架构下的缓存优化工作。有多年的大数据开发经验,熟悉Spark源码,从2014年开始参与Spark项目,曾为Spark贡献大量修复和新特性,也曾作为主要贡献者参与了OAP和SparkCube等Spark生态开源项目的开发。
译者序 xiii
对本书的赞誉 xv
序 .xvii
前言 xix
第 1章 Apache Spark简介:一站式分析引擎 1
1.1 Spark的起源 1
1.1.1 谷歌的大数据和分布式计算 1
1.1.2 雅虎的Hadoop 2
1.1.3 Spark在AMPLab崭露头角 3
1.2 什么是Spar 3
1.2.1 快速 4
1.2.2 易用 4
1.2.3 模块化 4
1.2.4 可扩展 5
1.3 一站式数据分析 5
1.3.1 由Spark组件组成的一站式软件栈 6
1.3.2 Spark的分布式执行 9
1.4 开发者体验 12
1.4.1 哪些人用Spark,用它做什么 13
1.4.2 社区接受度与社区发展 14
第 2 章 下载并开始使用Apache Spark 16
2.1 第 1 步:下载Spark 16
2.2 第 2 步:使用Scala shell 或PySpark shell 18
2.3 第3 步:理解Spark 应用的相关概念 22
2.3.1 Spark 应用与SparkSession 22
2.3.2 Spark 作业 23
2.3.3 Spark 执行阶段 23
2.3.4 Spark 任务 24
2.4 转化操作、行动操作以及惰性求值 24
2.5 Spark UI 26
2.6 第 一个独立应用 29
2.6.1 统计M&M 巧克力豆 29
2.6.2 用Scala 构建独立应用 34
2.7 小结 36
第3 章 Apache Spark 的结构化数据API 37
3.1 RDD 的背后是什么 37
3.2 Spark 支持结构化数据 38
3.3 DataFrame API 41
3.3.1 Spark 的基本数据类型 41
3.3.2 Spark 中结构化的复杂数据类型 42
3.3.3 表结构与DataFrame 43
3.3.4 列与表达式 47
3.3.5 行 49
3.3.6 常见的DataFrame 操作 50
3.3.7 完整的DataFrame 示例 59
3.4 Dataset API 60
3.4.1 有类型对象、无类型对象,以及普通行 61
3.4.2 创建Dataset 62
3.4.3 Dataset 操作 63
3.4.4 完整的Dataset 示例 65
3.5 对比DataFrame 和Dataset 65
3.6 Spark SQL 及其底层引擎 66
3.7 小结 71
第4 章 Spark SQL 与DataFrame:内建数据源概览 73
4.1 在Spark 应用中使用Spark SQL 74
4.2 SQL 表和视图 79
4.2.1 有管理表和无管理表 79
4.2.2 创建SQL 数据库和SQL 表 79
4.2.3 创建视图 80
4.2.4 查看元数据 82
4.2.5 缓存SQL 表 82
4.2.6 将表读取为DataFrame 82
4.3 DataFrame 和SQL 表的数据源 83
4.3.1 DataFrameReader 83
4.3.2 DataFrameWriter 85
4.3.3 Parquet 86
4.3.4 JSON 88
4.3.5 CSV 90
4.3.6 Avro 92
4.3.7 ORC 94
4.3.8 图像 96
4.3.9 二进制文件 97
4.4 小结 98
第5 章 Spark SQL 与DataFrame:读写外部数据源 100
5.1 Spark SQL 与Apache Hive 100
5.2 用Spark SQL shell、Beeline 和Tableau 查询 106
5.2.1 使用Spark SQL shell 106
5.2.2 使用Beeline 107
5.2.3 使用Tableau 108
5.3 外部数据源 114
5.3.1 JDBC 和SQL 数据库 114
5.3.2 PostgreSQL 115
5.3.3 MySQL 117
5.3.4 Azure Cosmos DB 118
5.3.5 MS SQL Server 120
5.3.6 其他外部数据源 121
5.4 DataFrame 和Spark SQL 的高阶函数 121
5.4.1 方式1:打散再重组 121
5.4.2 方式2:用户自定义函数 122
5.4.3 针对复杂数据类型的内建函数 122
5.4.4 高阶函数 124
5.5 常用的DataFrame 操作和Spark SQL 操作 127
5.5.1 联合 130
5.5.2 连接 130
5.5.3 窗口 131
5.5.4 修改 134
5.6 小结 137
第6 章 Spark SQL 与Dataset 138
6.1 Java 与Scala 共用一套API 138
6.2 操作Dataset 140
6.2.1 创建示例数据 141
6.2.2 转化示例数据 142
6.3 Dataset 与DataFrame 的内存管理 147
6.4 Dataset 编码器 147
6.4.1 Spark 内部格式与Java 对象格式 148
6.4.2 序列化与反序列化 148
6.5 使用Dataset 的开销 149
6.6 小结 151
第7 章 Spark 应用的优化与调优 152
7.1 为效率而优化与调优 152
7.1.1 查看与设置Spark 配置 152
7.1.2 为大型作业扩展Spark 155
7.2 数据的缓存与持久化 160
7.2.1 DataFrame.cache() 161
7.2.2 DataFrame.persist() 162
7.2.3 什么时候应该缓存和持久化 164
7.2.4 什么时候不应该缓存和持久化 164
7.3 Spark 的各种连接算法 164
7.3.1 广播哈希连接 165
7.3.2 混洗排序合并连接 166
7.4 查看Spark UI 173
7.5 小结 180
第8 章 结构化流处理 181
8.1 Spark 流处理引擎的演进过程 181
8.1.1 以微型批模拟的流处理 182
8.1.2 从DStream 获取的经验教训 183
8.1.3 Structured Streaming 的设计哲学 183
8.2 Structured Streaming 的编程模型 184
8.3 Structured Streaming 查询 186
8.3.1 五步定义流式查询 186
8.3.2 探究活跃的流式查询 191
8.3.3 失败恢复与精确一次语义 192
8.3.4 监控活跃的查询 194
8.4 流式数据源与数据池 196
8.4.1 文件 197
8.4.2 Kafka 199
8.4.3 自定义流式数据源与数据池 200
8.5 数据转化 204
8.5.1 增量执行与流处理状态 204
8.5.2 无状态转化操作 204
8.5.3 有状态转化操作 205
8.6 有状态的流式聚合 207
8.6.1 不根据时间维度进行聚合 207
8.6.2 使用事件时间窗口进行聚合 208
8.7 流式连接 214
8.7.1 流与静态表连接 214
8.7.2 流与流连接 215
8.8 任意的有状态计算 220
8.8.1 用mapGroupsWithState() 为任意有状态操作建模 220
8.8.2 用超时管理不活跃的分组 223
8.8.3 用flatMapGroupsWithState() 进行通用操作 226
8.9 性能调优 227
8.10 小结 229
第9 章 用Apache Spark 构建可靠的数据湖 230
9.1 存储解决方案的重要特点 230
9.2 数据库 231
9.2.1 数据库简介 231
9.2.2 用Spark 读写数据库 232
9.2.3 数据库的不足之处 232
9.3 数据湖 233
9.3.1 数据湖简介 233
9.3.2 用Spark 读写数据湖 233
9.3.3 数据湖的不足之处 234
9.4 湖仓一体:下一代存储解决方案 235
9.4.1 Apache Hudi 236
9.4.2 Apache Iceberg 236
9.4.3 Delta Lake 236
9.5 用Spark 与Delta Lake 构建湖仓一体的系统 237
9.5.1 为使用Delta Lake 配置Spark 237
9.5.2 把数据加载到Delta Lake 表中 238
9.5.3 把数据流加载到Delta Lake 表中 240
9.5.4 写数据时强化表结构约束以防止数据损坏 241
9.5.5 修改表结构以适应数据变化 242
9.5.6 转化已有数据 242
9.5.7 根据操作历史审计数据变更 245
9.5.8 用时间旅行功能查询表以前的快照数据 245
9.6 小结 246
第 10 章 用MLlib 实现机器学习 247
10.1 什么是机器学习 247
10.1.1 监督学习 248
10.1.2 无监督学习 249
10.1.3 为什么将Spark 用于机器学习 250
10.2 设计机器学习流水线 251
10.2.1 接入并探索数据 251
10.2.2 创建训练集与测试集 252
10.2.3 为转化器准备特征 254
10.2.4 理解线性回归 255
10.2.5 用预估器构建模型 256
10.2.6 创建流水线 257
10.2.7 评估模型 262
10.2.8 保存和加载模型 266
10.3 超参数调优 266
10.3.1 基于树的模型 267
10.3.2 k 折交叉验证 274
10.3.3 优化流水线 277
10.4 小结 279
第 11 章 用Apache Spark管理、部署与伸缩机器学习流水线 280
11.1 模型管理 280
11.2 用MLlib 部署模型所用的选项 286
11.2.1 批处理 287
11.2.2 流处理 289
11.2.3 导出模型用于实时预测的模式 290
11.3 利用Spark 使用非MLlib 模型 291
11.3.1 Pandas UDF 291
11.3.2 将Spark 用于分布式超参数调优 293
11.4 小结 295
第 12 章 尾声:Apache Spark 3.0 296
12.1 Spark 内核与Spark SQL 296
12.1.1 动态分区裁剪 296
12.1.2 自适应查询执行 298
12.1.3 SQL 连接提示 301
12.1.4 Catalog 插件API 与DataSourceV2 302
12.1.5 可感知加速器的调度器 303
12.2 Structured Streaming 304
12.3 PySpark、Pandas UDF 和Pandas 函数API 306
12.3.1 重新设计的带有Python 类型提示的Pandas UDF 306
12.3.2 Pandas UDF 中的迭代器支持 307
12.3.3 新的Pandas 函数API 307
12.4 有改动的功能 308
12.4.1 支持的与不推荐使用的编程语言 309
12.4.2 DataFrame API 和Dataset API 的改动 309
12.4.3 DataFrame 与SQL 的explain 命令 309
12.5 小结 311
作者简介 313
封面简介 313