Spark大數據開發與應用案例(視頻教學版)
段海濤、楊忠良、余輝
商品描述
作者簡介
目錄大綱
目 錄
第1章 Spark簡介 1
1.1 Spark概念及其特點 1
1.2 Spark技術生態系統 2
1.3 Spark運行模式 4
1.4 Spark執行流程 8
1.5 Spark專有名詞 9
1.6 本章小結 11
第2章 Spark集群環境部署 12
2.1 VM虛擬機安裝 13
2.2 Ubuntu 22.04系統安裝 19
2.3 Ubuntu 22.04網絡配置 24
2.4 Ubuntu 22.04環境配置 28
2.5 ZooKeeper安裝 33
2.6 Hadoop安裝 35
2.6.1 下載並解壓 35
2.6.2 配置系統環境變量 35
2.6.3 配置核心文件 36
2.6.4 分發Hadoop 40
2.6.5 啟動和驗證 40
2.7 Spark安裝 47
2.7.1 下載和解壓 47
2.7.2 配置系統環境變量 47
2.7.3 配置核心文件 47
2.7.4 分發Spark 48
2.7.5 Spark啟動及UI界面查看 48
2.7.6 spark-shell啟動驗證 49
2.8 集群和代碼下載 50
2.9 本章小結 52
第3章 Spark編程體驗 54
3.1 Scala基礎編程 54
3.1.1 基本語法 55
3.1.2 函數和方法 57
3.1.3 控制語句 59
3.1.4 函數式編程 62
3.1.5 類和對象 67
3.1.6 Scala異常處理 70
3.1.7 Trait(特征) 72
3.1.8 Scala文件I/O 73
3.1.9 Scala練習題 74
3.2 Spark創建項目 80
3.3 Spark程序編寫與運行方法 90
3.4 本章小結 92
第4章 RDD深度解讀 93
4.1 RDD的概念及特點 93
4.1.1 RDD的特點 94
4.1.2 RDD的算子分類 95
4.1.3 RDD創建方法 95
4.2 RDD的血緣和依賴 97
4.2.1 血緣與依賴的概念 98
4.2.2 Dependency依賴關系 98
4.3 RDD的Transformation算子 103
4.4 RDD的Action算子 122
4.5 RDD的特殊算子 129
4.5.1 cache和persist 129
4.5.2 checkpoint 131
4.6 RDD轉換算子的惰性 133
4.6.1 Scala疊代器Iterator接口 133
4.6.2 Scala疊代器Lazy特性及原理 134
4.7 模擬Spark自定義RDD 135
4.8 Spark任務執行原理圖解分析 138
4.8.1 WordCount程序元素分解 138
4.8.2 WordCount程序圖解 139
4.8.3 Stage和Task的類型 142
4.9 案例:多種算子實現WordCount 143
4.9.1 map + reduceByKey 144
4.9.2 countByValue 145
4.9.3 aggregateByKey或foldByKey 146
4.9.4 groupByKey+map 147
4.9.5 Scala原生實現wordCount 148
4.9.6 combineByKey 149
4.10 本章小結 150
第5章 RDD的Shuffle詳解 151
5.1 Shuffle的概念及歷史 151
5.1.1 Shuffle的概念 151
5.1.2 Shuffle演進的歷史 152
5.2 Shuffle的驗證及復用性 153
5.2.1 案例:reduceByKey一定會Shuffle嗎 153
5.2.2 案例:join操作一定會觸發Shuffle嗎 155
5.2.3 Shuffle數據的復用實驗 156
5.3 HashShuffleManager 160
5.3.1 HashShuffleManager優化前 160
5.3.2 HashShuffleManager優化後 161
5.4 SortShuffleManager 162
5.4.1 普通運行機制 163
5.4.2 Bypass運行機制 164
5.5 本章小結 164
第6章 Spark共享變量 166
6.1 廣播變量 166
6.1.1 廣播變量的使用場景 166
6.1.2 廣播變量的實現原理 168
6.1.3 案例:兩個集合進行結合 168
6.2 累加器 170
6.2.1 累加器使用場景 170
6.2.2 累加器實現原理 171
6.2.3 案例:自定義累加器 173
6.2.4 案例:不使用累加器的方案 174
6.2.5 案例:使用累加器的方法 175
6.3 本章小結 176
第7章 Spark序列化和線程安全 177
7.1 Spark序列化 177
7.1.1 序列化問題的場景 177
7.1.2 數據Bean未實現序列化接口 178
7.1.3 函數閉包及其示例 179
7.2 Task線程安全 191
7.2.1 線程不安全及其解決方案 191
7.2.2 避免線程不安全的示例 192
7.3 本章小結 195
第8章 Spark內存管理機制 196
8.1 內存管理概述 196
8.2 堆內內存和堆外內存的區別 197
8.3 堆內內存 198
8.4 堆外內存 201
8.5 本章小結 204
第9章 Spark SQL簡介 205
9.1 Spark SQL的定義和特性 205
9.2 Spark SQL編程抽象 206
9.3 Spark SQL快速體驗 207
9.3.1 程序使用示例 208
9.3.2 命令行使用示例 209
9.3.3 新的編程入口SparkSession 211
9.4 本章小結 212
第10章 Spark SQL抽象編程詳解 213
10.1 DataFrame創建 213
10.1.1 使用RDD創建DataFrame 214
10.1.2 從結構化文件創建DataFrame 220
10.1.3 外部存儲服務創建DataFrame 224
10.2 DataFrame運算 230
10.2.1 SQL風格操作 230
10.2.2 DSL風格API(TableApi)語法 230
10.3 DataFrame輸出 236
10.3.1 輸出控制臺 236
10.3.2 輸出文件 236
10.3.3 輸出到RDBMS 237
10.3.4 輸出到Hive 237
10.3.5 DataFrame輸出時的分區操作 238
10.4 RDD代碼和SQL代碼混合編程 240
10.4.1 Dataset和DataFrame的區別及取數 241
10.4.2 由RDD創建DataFrame 246
10.4.3 由RDD創建Dataset 256
10.5 RDD、Dataset與DataFrame的互相轉換 261
10.6 本章小結 262
第11章 Spark SQL自定義函數 263
11.1 用戶自定義函數UDF 263
11.1.1 UDF函數的概念及其特點 263
11.1.2 UDF案例1:字符串處理 264
11.1.3 UDF案例2:GEOHASH算法 265
11.1.4 UDF案例3:余弦相似度算法 269
11.1.5 UDF註意事項 271
11.2 用戶自定義聚合函數UDAF 272
11.2.1 UDAF的編程模板 272
11.2.2 UDAF原理講解 273
11.2.3 弱類型用戶自定義聚合函數 274
11.2.4 強類型用戶自定義聚合函數 276
11.2.5 UDAF註意事項 279
11.3 本章小結 279
第12章 Spark SQL源碼解讀 280
12.1 Spark SQL的執行過程 280
12.2 元數據管理器SessionCatalog 281
12.3 SQL解析成邏輯執行計劃 281
12.4 Analyzer綁定邏輯計劃 284
12.5 Optimizer優化邏輯計劃 286
12.5.1 謂詞下推 290
12.5.2 列裁剪 290
12.5.3 常量替換 291
12.5.4 常量累加 292
12.6 使用SparkPlanner生成物理計劃 293
12.7 從物理執行計劃獲取inputRdd執行 296
12.8 本章小結 296
第13章 Spark性能調優 297
13.1 Spark常規性能調優 297
13.1.1 常規性能調優一:最優資源配置 297
13.1.2 常規性能調優二:RDD優化 298
13.1.3 常規性能調優三:並行度調節 299
13.1.4 常規性能調優四:廣播大變量 299
13.1.5 常規性能調優五:Kryo序列化 300
13.1.6 常規性能調優六:調節本地化等待時長 300
13.1.7 常規性能調優七:ShuGle調優 301
13.1.8 常規性能調優八:JVM調優 302
13.2 Spark開發原則優化 304
13.2.1 開發原則一:避免創建重復的RDD 304
13.2.2 開發原則二:避免創建重復的DataFrame 305
13.2.3 開發原則三:盡可能復用同一個RDD 305
13.2.4 開發原則四:避免重復性的SQL查詢,對DataFrame復用 306
13.2.5 開發原則五:註意數據類型的使用 307
13.2.6 開發原則六:寫出高質量的SQL 308
13.3 Spark調優方法 310
13.3.1 優化數據結構 310
13.3.2 使用緩存(Cache) 310
13.3.3 對配置屬性進行調優 312
13.3.4 合理使用廣播 314
13.3.5 盡量避免使用Shuffle算子 315
13.3.6 使用map-side預聚合的Shuffle操作 316
13.3.7 使用高性能算子 317
13.3.8 盡量在一次調用中處理一個分區的數據 318
13.3.9 對數據進行序列化 318
13.4 Spark數據傾斜調優 319
13.4.1 調整分區數目 319
13.4.2 去除多余的數據 320
13.4.3 使用廣播將Reduce Join轉換為Map Join 320
13.4.4 將key進行拆分,大數據轉換為小數據 321
13.4.5 數據傾斜定位和解決 322
13.5 本章小結 327
第14章 Spark實戰案例 328
14.1 Spark Core電影數據分析 328
14.1.1 表格及數據樣例 329
14.1.2 連續登錄超過3天的用戶DSL風格 329
14.1.3 連續登錄超過3天的用戶SQL風格 330
14.1.4 電影統計DSL風格 332
14.1.5 電影統計SQL風格 333
14.1.6 電影統計運行結果 336
14.2 Spark Core日誌數據分析 337
14.2.1 前期準備 338
14.2.2 統計PV和可視化 339
14.2.3 統計UV和可視化 342
14.2.4 統計TopN和可視化 346
14.3 Spark SQL電商數據分析 350
14.3.1 數據和表格說明 350
14.3.2 加載數據 351
14.3.3 計算每年的銷售單數和銷售總額 354
14.3.4 查詢每年最大金額的訂單及其金額 355
14.3.5 計算每年最暢銷的貨品 356
14.4 Spark SQL金融數據分析 358
14.4.1 數據準備 359
14.4.2 最大值和最小值 360
14.4.3 平均值 361
14.4.4 樣本標準差和總體標準差 361
14.4.5 中位數 362
14.4.6 四分位數 364
14.5 本章小結 365
第15章 Spark面試題 366
15.1 Spark核心概念面試題 366
15.1.1 簡述Spark是什麼 366
15.1.2 簡述Spark 3.0的特性 367
15.1.3 簡述Spark生態系統有哪些組件 367
15.1.4 簡述Spark的運行流程 368
15.1.5 簡述Spark的主要功能與特性 368
15.1.6 簡述Spark中RDD的Partitioner是如何決定的 369
15.1.7 簡述SparkContext與SparkSession之間的區別是什麼 369
15.1.8 簡述Spark的幾種運行模式 370
15.1.9 簡述DAG為什麼適合Spark 371
15.1.10 簡述DAG如何劃分Stage 371
15.2 Spark架構原理面試題 372
15.2.1 簡述Spark SQL的執行原理 372
15.2.2 簡述Spark SQL執行的流程 372
15.2.3 簡述Spark相較於MapReduce的優勢 373
15.2.4 簡述RDD的寬依賴和窄依賴產生的原理 373
15.2.5 簡述Stage的內部邏輯 374
15.2.6 簡述為什麼要根據寬依賴劃分Stage 374
15.2.7 簡述Spark on YARN運行過程 374
15.2.8 簡述YARN Client與YARN Cluster的區別 375
15.2.9 簡述Spark的YARN Cluster涉及的參數有哪些 376
15.2.10 簡述Spark廣播變量的實現和原理 376
15.3 Spark編程實踐面試題 377
15.3.1 簡述RDD是什麼 377
15.3.2 簡述對RDD機制的理解 377
15.3.3 簡述RDD的寬依賴和窄依賴 378
15.3.4 簡述RDD持久化原理是什麼 378
15.3.5 簡述RDD的容錯機制 378
15.3.6 簡述RDD的緩存級別 378
15.3.7 簡述DAG中為什麼要劃分Stage 380
15.3.8 簡述Spark SQL的數據傾斜解決方案 380
15.3.9 簡述Spark SQL如何將數據寫入Hive表 381
15.3.10 簡述Spark SQL如何使用UDF 381
15.4 Spark性能調優面試題 382
15.4.1 簡述Spark Checkpoint 382
15.4.2 簡述Spark中Checkpoint和持久化機制的區別 383
15.4.3 簡述Spark中的OOM問題 384
15.4.4 簡述Spark程序執行時,如何修改默認Task執行個數 384
15.4.5 簡述Spark Join操作的優化經驗 385
15.4.6 簡述Map Join的實現原理 386
15.4.7 簡述Spark Shuffle在什麼情況下會產生 387
15.4.8 簡述Spark Shuffle會在哪些算子中出現 387
15.4.9 簡述Spark中的Transform和Action 387
15.4.10 Spark的Job、Stage、Task如何劃分 389
15.5 Spark實戰應用面試題 389
15.5.1 簡述Map和flatMap的區別 389
15.5.2 簡述Map和mapPartition的區別 390
15.5.3 簡述reduceByKey和groupByKey的區別 391
15.5.4 簡述DataFrame的Cache和Persist的區別 391
15.5.5 簡述reduceByKey和reduce的區別 392
15.5.6 簡述Spark運行時並行度的設置 393
15.5.7 簡述Spark解決了Hadoop的哪些問題 394
15.5.8 簡述RDD、DataFrame、Dataset和DataStream的區別 395
15.5.9 簡述Spark和MapReduce Shuffle的區別 395
15.5.10 簡述RDD中reduceBykey與groupByKey哪個性能好 396
15.6 本章小結 396