內容簡介
本書的主角是在大數據時代應運而生的數據處理與分析利器——Spark。你將通過豐富的示例學習如何使用Spark的結構化數據API,利用Spark SQL進行互動式查詢,掌握Spark套用的最佳化之道,用Spark和Delta Lake等開源工具構建可靠的數據湖,並用MLlib庫實現機器學習流水線。隨著Spark從2.x版本升級到3.0版本,本書第2版做了全面的更新,以體現Spark生態系統在機器學習、流處理技術等方面的發展,另新增一章詳解Spark 3.0引入的新特性。
圖書目錄
譯者序 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
作者簡介
朱爾斯.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生態開源項目的開發。