高性能Spark High Performance Spark: Best Practices for Scaling and Optimizing Apache Spark

Holden Karau,Rachel Warren 夏銳 譯

商品描述

通過本書,你可以了解到:Spark SQL的新接口如何為SQL的RDD數據結構提升性能。
Spark Core與Spark SQL中數據join的不同選擇方式。
充分利用標準RDD轉換的技術。
如何解決Spark中鍵值範式的性能問題。
不借助Scala或其他JVM語言來編寫高性能的Spark代碼。
採用改進建議後,如何來測試其功能及性能情況。
使用Spark MLlib和Spark ML機器學習庫。
Spark的流處理組件、外部的社區擴展包。

作者簡介

Holden Karau

是一位加拿大人,在IBM的Spark技術中心擔任軟件開發工程師。
同時作為一位Spark committer,經常在PySpark和機器學習方面進行貢獻。
另外曾在多次國際會議中發表關於Spark的演講。


Rachel Warren

是Alpine Data的軟件工程師和數據科學家。
在工作中,她利用Spark來解決實際場景中的數據處理和機器學習問題。
另外,她還曾在工業界以及學術界擔任過分析師和導師。

目錄大綱

前言 .1
1 章 高性能Spark 介紹 7
1.1 Spark 是什麼以及性能的重要性 .7
1.2 你可以從本書中得到什麼 8
1.3 Spark 版本 .9
1.4 為什麼是 Scala ? 9
1.4.1 成為一名 Spark 專家必須要學習一點 Scala .9
1.4.2 Spark 的 Scala API 比 Java API 更好用 10
1.4.3 Scala 比 Python 更高效 10
1.4.4 為什麼不用 Scala ? 11
1.4.5 學習 Scala 11
1.5 小結 12
2 章 Spark 運行原理 .13
2.1 Spark 如何融入大數據生態系統 14
2.2 Spark 並行計算模型:RDD 16
2.2.1 惰性求值 17
2.2.2 內存持久化和內存管理 20
2.2.3 不可變性和 RDD 接口 . 21
2.2.4 RDD 的類型 23
2.2.5 RDD 上的函數:轉換與行動 24
2.2.6 寬依賴和窄依賴 25
2.3 Spark 作業調度 . 27
2.3.1 應用程序間的資源分配 27
2.3.2 Spark 應用程序 . 28
2.4 Spark Job 剖析 29
2.4.1 有向無環圖(DAG) 30
2.4.2 作業(Job) 31
2.4.3 階段(Stage) 31
2.4.4 任務(Task) 32
2.5 小結 34
3 章 DataFrame、Dataset 和Spark SQL 35
3.1 從 SparkSession(或者 HiveContet 和 SQLContet)入門 . 36
3.2 Spark SQL 依賴 39
3.2.1 管理 Spark 依賴 39
3.2.2 避免使用 Hive JAR 40
3.3 schema 基礎 41
3.4 DataFrame API 45
3.4.1 轉換 45
3.4.2 基於多個 DataFrame 的轉換 . 56
3.4.3 普通的 SQL 查詢以及與 Hive 數據交互 . 57
3.5 DataFrame 和 Dataset 中的數據表示 . 58
3.6 數據加載和保存函數 . 59
3.6.1 DataFrameWriter 和 DataFrameReader . 60
3.6.2 格式 60
3.6.3 保存模式 70
3.6.4 分區(發現和寫入) . 70
3.7 Dataset 71
3.7.1 與 RDD、DataFrame 和本地集合的互作性 72
3.7.2 編譯時強類型 73
3.7.3 簡易函數式轉換作(類似 RDD) . 74
3.7.4 關係型轉換作 74
3.7.5 多 Dataset 關係轉換作 . 75
3.7.6 Dataset 的分組作 75
3.8 使用用戶自定義的函數和聚合函數(UDF、UDAF)進行擴展 . 76
3.9 查詢優化器 . 79
3.9.1 邏輯和物理計劃 79
3.9.2 代碼生成 79
3.9.3 大型查詢計劃和迭代算法 80
3.10 調試 Spark SQL 查詢 80
3.11 JDBC/ODBC 服務器 81
3.12 小結 . 82
4 章 Join (SQL 和Spark Core) 84
4.1 Spark Core 中的 Join . 84
4.1.1 選擇 Join 類型 86
4.1.2 選擇執行計劃 88
4.2 Spark SQL 中的 Join 91
4.2.1 DataFrame 的 Join 91
4.2.2 Dataset 的 Join 95
4.3 小結 96
5 章 高效的轉換 .97
5.1 窄轉換與寬轉換 98
5.1.1 對於性能的影響 100
5.1.2 對於容錯的影響 101
5.1.3 coalesce 的特殊情況 102
5.2 轉換會返回什麼類型的 RDD . 102
5.3 小化對象創建成本 104
5.3.1 重用現有對象 . 104
5.3.2 使用更小的數據結構 108
5.4 mapPartitions 迭代器到迭代器的轉換 111
5.4.1 什麼是迭代器到迭代器的轉換? 112
5.4.2 空間和時間優勢 113
5.4.3 案例 . 114
5.5 集合作 117
5.6 降低初始化開銷 118
5.6.1 共享變量 119
5.6.2 廣播變量 119
5.6.3 累加器 121
5.7 重用 RDD . 125
5.7.1 重用的案例 126
5.7.2 判斷重新計算是否足夠划算 129
5.7.3 重用類型:緩存、持久化、檢查點、shuffle 文件 130
5.7.4 Alluio(之前的 Tachyon) 135
5.7.5 LRU 緩存 . 135
5.7.6 繁忙集的注意事項 137
5.7.7 與累加器交互 . 138
5.8 小結 . 139
6 章 處理鍵值對數據 . 140
6.1 金發女孩案例 . 142
6.1.1 金發女孩之版本 0:迭代方案 143
6.1.2 如何使用 PairRDDFunctions 和 OrderedRDDFunctions 146
6.2 鍵值對上的行動作 147
6.3 groupByKey 函數有什麼風險 . 148
6.3.1 金發女孩之版本 1:groupByKey 方案 148
6.3.2 為什麼 groupByKey 會失敗 150
6.4 選擇聚合作 . 152
6.5 涉及多個 RDD 的作 156
6.6 分區器和鍵值對數據 157
6.6.1 使用 Spark 的分區器對象 . 158
6.6.2 哈希分區 158
6.6.3 範圍分區 159
6.6.4 自定義分區 160
6.6.5 保留跨不同轉換的分區信息 160
6.6.6 利用協同位置(Co-located)和協同分區(Co-Partitioned)
的 RDD 161
6.6.7 PairRDDFunctions 中關於映和分區函數的字典 163
6.7 OrderedRDDFunctions 字典 165
6.8 二級排序和 repartitionAndSortWithinPartitions 167
6.8.1 在按鍵分組和按值排序的函數中利用
repartitionAndSortWithinPartitions 168
6.8.2 如何不按照兩個排序鍵排序 172
6.8.3 金發女孩之版本 2:二級排序 172
6.8.4 金發女孩問題的另外一種不同解法 . 176
6.8.5 金發女孩之版本 3:對單元格值排序 . 181
6.9 掉隊檢測與不均衡數據 . 182
6.9.1 再次回到金發女孩問題 . 184
6.9.2 金發女孩之版本 4:在每個分區上歸併為不同值 184
6.10 小結 191
7 章 Scala 之外 192
7.1 JVM 之內、Scala 之外 194
7.2 Scala 之外、JVM 之外 198
7.2.1 PySpark 工作原理 . 198
7.2.2 SparkR 工作原理 207
7.2.3 Spark.jl(Julia Spark) 209
7.2.4 Eclair JS 工作原理 210
7.2.5 Spark 基於公共語言運行時(CLR),C# 及類似語言 211
7.3 在 Spark 中調用其他語言 . 211
7.3.1 使用管道及類似工具 211
7.3.2 JNI 213
7.3.3 Java 本地訪問(JNA) . 216
7.3.4 一切的背後都是 FORTRAN 217
7.3.5 談談 GPU . 218
7.4 未來 . 219
7.5 小結 . 219
8 章 測試和驗證 221
8.1 單元測試 221
8.1.1 一般 Spark 單元測試 222
8.1.2 模擬 RDD . 227
8.2 獲取測試數據 . 228
8.2.1 生成大數據集 . 229
8.2.2 抽樣 . 230
8.3 用 ScalaCheck 檢查屬性 232
8.4 集成測試 235
8.5 性能驗證 237
8.5.1 用於性能驗證的 Spark 計數器 237
8.5.2 性能驗證相關項目 238
8.6 作業驗證 239
8.7 小結 . 240
9 章 Spark MLlib 和ML 241
9.1 在 Spark MLlib 和 Spark ML 之間選擇 . 241
9.2 使用 MLlib 242
9.2.1 MLlib 入門(組織和導入) 242
9.2.2 MLlib 特徵編碼和數據準備 244
9.2.3 特徵縮放和選擇 248
9.2.4 MLlib 模型訓練 . 249
9.2.5 預測 . 250
9.2.6 服務和持久化 . 251
9.2.7 模型評估 254
9.3 使用 Spark ML 254
9.3.1 Spark ML 組織和導入 254
9.3.2 管道階段 256
9.3.3 參數解釋 257
9.3.4 數據編碼 258
9.3.5 數據清洗 261
9.3.6 Spark ML 模型 261
9.3.7 整合成管道 262
9.3.8 訓練管道 263
9.3.9 訪問單個階段 . 264
9.3.10 數據持久化和 Spark ML . 264
9.3.11 使用自定義算法擴展 Spark ML 管道 267
9.3.12 模型和管道持久化與 Spark ML 服務 275
9.4 一般服務考量因素 276
9.5 小結 . 276
10 章 Spark 組件和包 278
10.1 基於 Spark 的流處理 280
10.1.1 Source 和 Sink . 281
10.1.2 批處理間隔 283
10.1.3 數據 checkpoint 間隔 284
10.1.4 DStream 的注意事項 284
10.1.5 Structured Streaming 的考量因素 286
10.1.6 高可用性模式(或處理 Driver 程序故障或進行 checkpoint) 294
10.2 GraphX 295
10.3 使用社區包和庫 295
10.4 小結 298
附錄 調優、調試以及開發者容易忽略的其他問題 301