《深入理解SPARK:核心思想與源碼分析》結合大量圖和示例,對Spark的架構、部署模式和工作模組的設計理念、實現源碼與使用技巧進行了深入的剖析與解讀。
本書特色:
按照源碼分析的習慣設計,條分縷析。
多圖、多示例,幫讀者快速在頭腦中“建模”。
原理與實現剖析,幫助讀者提升架構設計、程式設計等方面的能力。
儘可能保留較多的源碼,方便離線和移動環境的閱讀。
基本介紹
- 中文名:深入理解SPARK:核心思想與源碼分析
- 外文名:Spark Internals:Core Design and Source Code Analysis
- 作 者:耿嘉安
- ISBN:9787111522348
- 技術範疇:大數據
- 出版社:機械工業出版社
- 出版時間:2016-01-01
- 包裝:平裝
- 開本:16開
- 頁數:469
- 定價:99
內容簡介,作者簡介,精彩書評,目錄,
內容簡介
《深入理解SPARK:核心思想與源碼分析》一書對Spark1.2.0版本的原始碼進行了全面而深入的分析,旨在為Spark的最佳化、定製和擴展提供原理性的指導。阿里巴巴集團專家鼎力推薦、阿里巴巴資深Java開發和大數據專家撰寫。
本書分為三篇:
準備篇(第1~2章),介紹了Spark的環境搭建、設計理念與基本架構,幫助讀者了解一些背景知識。
核心設計篇(第3~7章),著重講解SparkContext的初始化、存儲體系、任務提交與執行、計算引擎及部署模式的原理和源碼分析。通過這部分的內容,讀者可以通過源碼剖析更加深入理解Spark的核心設計與實現,以便在實際使用中能夠快速解決線上問題並對性能進行調優。
擴展篇(第8~11章),主要講解基於Spark核心的各種擴展及套用,包括SQL處理引擎、Hive處理、流式計算框架Spark Streaming、圖計算框架GraphX、機器學習庫MLlib等內容。通過閱讀這部分內容,讀者可以擴展實際項目中對Spark的套用場景,讓Spark煥發活力。
作者簡介
耿嘉安,10年IT行業相關經驗。就職於阿里巴巴商家業務事業部,任資深Java工程師,專注於開源和大數據領域,目前與小夥伴們基於ODPS構建阿里的大數據商業解決方案——御膳房。在大量的工作實踐中,對J2EE、JVM、Tomcat、Spring、Hadoop、Spark、MySQL、Redis都有深入研究,尤其喜歡剖析開源項目的源碼實現。早期從事J2EE企業級套用開發,對Java相關技術有獨到見解。業餘時間喜歡研究中國古代歷史,古詩詞,旅遊,足球等。
精彩書評
伴隨著網際網路的不斷演進,人類所面臨的數據在體量,產生速度和多樣性方面階躍性發展,隨之而來的是數據計算和處理方式的多樣化,目前越來越多的數據處理鏈路是通過多種計算組合而成,例如批量與流式計算,圖計算,互動式查詢等。而以往幾個獨立計算系統“物理”拼裝組合成的複雜系統在處理這些問題時,往往在成本和效率上產生瓶頸。Spark從疊代計算的數據復用切入,底層一個runtime來支撐多種計算模型,越來越受到業界的重視,社區發展非常迅速。而本書從源碼分析角度深入剖析系統,希望讀者不僅做到知其然,更要知其所以然,對Spark有更加深入的研究。本書作者在相關領域有多年豐富的實踐和套用經驗,相信通過研讀本書必定可以給讀者帶來事半功倍的效果。
——強琦 阿里雲計算平台資深技術專家
這是一本不錯的Spark的入門書籍,完全從工程師的視角出發,從安裝到使用再到高階套用。有些時候甚至有些囉嗦,但這不正是我們讀者需要的么?作者用他專一的一線工程師視角與在阿里面臨的場景結合,寫作的落筆相當接地氣。這是一本難得的工程師參考用書。
——張茂森 阿里巴巴商家業務事業部資深數據挖掘專家
目錄
前言
準 備 篇
第1章 環境準備 2
1.1 運行環境準備 2
1.1.1 安裝JDK 3
1.1.2 安裝Scala 3
1.1.3 安裝Spark 4
1.2 Spark初體驗 4
1.2.1 運行spark-shell 4
1.2.2 執行word count 5
1.2.3 剖析spark-shell 7
1.3 閱讀環境準備 11
1.4 Spark源碼編譯與調試 13
1.5 小結 17
第2章 Spark設計理念與基本架構 18
2.1 初識Spark 18
2.1.1 Hadoop MRv1的局限 18
2.1.2 Spark使用場景 20
2.1.3 Spark的特點 20
2.2 Spark基礎知識 20
2.3 Spark基本設計思想 22
2.3.1 Spark模組設計 22
2.3.2 Spark模型設計 24
2.4 Spark基本架構 25
2.5 小結 26
核心設計篇
第3章 SparkContext的初始化 28
3.1 SparkContext概述 28
3.2 創建執行環境SparkEnv 30
3.2.1 安全管理器SecurityManager 31
3.2.2 基於Akka的分散式訊息系統ActorSystem 31
3.2.3 map任務輸出跟蹤器mapOutputTracker 32
3.2.4 實例化ShuffleManager 34
3.2.5 shuffle執行緒記憶體管理器ShuffleMemoryManager 34
3.2.6 塊傳輸服務BlockTransferService 35
3.2.7 BlockManagerMaster介紹 35
3.2.8 創建塊管理器BlockManager 36
3.2.9 創建廣播管理器Broadcast-Manager 36
3.2.10 創建快取管理器CacheManager 37
3.2.11 HTTP檔案伺服器HttpFile-Server 37
3.2.12 創建測量系統MetricsSystem 39
3.2.13 創建SparkEnv 40
3.3 創建metadataCleaner 41
3.4 SparkUI詳解 42
3.4.1 listenerBus詳解 43
3.4.2 構造JobProgressListener 46
3.4.3 SparkUI的創建與初始化 47
3.4.4 Spark UI的頁面布局與展示 49
3.4.5 SparkUI的啟動 54
3.5 Hadoop相關配置及Executor環境變數 54
3.5.1 Hadoop相關配置信息 54
3.5.2 Executor環境變數 54
3.6 創建任務調度器TaskScheduler 55
3.6.1 創建TaskSchedulerImpl 55
3.6.2 TaskSchedulerImpl的初始化 57
3.7 創建和啟動DAGScheduler 57
3.8 TaskScheduler的啟動 60
3.8.1 創建LocalActor 60
3.8.2 ExecutorSource的創建與註冊 62
3.8.3 ExecutorActor的構建與註冊 64
3.8.4 Spark自身ClassLoader的創建 64
3.8.5 啟動Executor的心跳執行緒 66
3.9 啟動測量系統MetricsSystem 69
3.9.1 註冊Sources 70
3.9.2 註冊Sinks 70
3.9.3 給Sinks增加Jetty的Servlet-ContextHandler 71
3.10 創建和啟動ExecutorAllocation-Manager 72
3.11 ContextCleaner的創建與啟動 73
3.12 Spark環境更新 74
3.13 創建DAGSchedulerSource和BlockManagerSource 76
3.14 將SparkContext標記為激活 77
3.15 小結 78
第4章 存儲體系 79
4.1 存儲體系概述 79
4.1.1 塊管理器BlockManager的實現 79
4.1.2 Spark存儲體系架構 81
4.2 shuffle服務與客戶端 83
4.2.1 Block的RPC服務 84
4.2.2 構造傳輸上下文Transpor-tContext 85
4.2.3 RPC客戶端工廠Transport-ClientFactory 86
4.2.4 Netty伺服器TransportServer 87
4.2.5 獲取遠程shuffle檔案 88
4.2.6 上傳shuffle檔案 89
4.3 BlockManagerMaster對Block-Manager的管理 90
4.3.1 BlockManagerMasterActor 90
4.3.2 詢問Driver並獲取回複方法 92
4.3.3 向BlockManagerMaster註冊BlockManagerId 93
4.4 磁碟塊管理器DiskBlockManager 94
4.4.1 DiskBlockManager的構造過程 94
4.4.2 獲取磁碟檔案方法getFile 96
4.4.3 創建臨時Block方法create-TempShuffleBlock 96
4.5 磁碟存儲DiskStore 97
4.5.1 NIO讀取方法getBytes 97
4.5.2 NIO寫入方法putBytes 98
4.5.3 數組寫入方法putArray 98
4.5.4 Iterator寫入方法putIterator 98
4.6 記憶體存儲MemoryStore 99
4.6.1 數據存儲方法putBytes 101
4.6.2 Iterator寫入方法putIterator詳解 101
4.6.3 安全展開方法unrollSafely 102
4.6.4 確認空閒記憶體方法ensureFreeSpace 105
4.6.5 記憶體寫入方法putArray 107
4.6.6 嘗試寫入記憶體方法tryToPut 108
4.6.7 獲取記憶體數據方法getBytes 109
4.6.8 獲取數據方法getValues 110
4.7 Tachyon存儲TachyonStore 110
4.7.1 Tachyon簡介 111
4.7.2 TachyonStore的使用 112
4.7.3 寫入Tachyon記憶體的方法putIntoTachyonStore 113
4.7.4 獲取序列化數據方法getBytes 113
4.8 塊管理器BlockManager 114
4.8.1 移出記憶體方法dropFrom-Memory 114
4.8.2 狀態報告方法reportBlockStatus 116
4.8.3 單對象塊寫入方法putSingle 117
4.8.4 序列化位元組塊寫入方法putBytes 118
4.8.5 數據寫入方法doPut 118
4.8.6 數據塊備份方法replicate 121
4.8.7 創建DiskBlockObjectWriter的方法getDiskWriter 125
4.8.8 獲取本地Block數據方法getBlockData 125
4.8.9 獲取本地shuffle數據方法doGetLocal 126
4.8.10 獲取遠程Block數據方法doGetRemote 127
4.8.11 獲取Block數據方法get 128
4.8.12 數據流序列化方法dataSerializeStream 129
4.9 metadataCleaner和broadcastCleaner 129
4.10 快取管理器CacheManager 130
4.11 壓縮算法 133
4.12 磁碟寫入實現DiskBlockObjectWriter 133
4.13 塊索引shuffle管理器IndexShuffleBlockManager 135
4.14 shuffle記憶體管理器ShuffleMemoryManager 137
4.15 小結 138
第5章 任務提交與執行 139
5.1 任務概述 139
5.2 廣播Hadoop的配置信息 142
5.3 RDD轉換及DAG構建 144
5.3.1 為什麼需要RDD 144
5.3.2 RDD實現分析 146
5.4 任務提交 152
5.4.1 任務提交的準備 152
5.4.2 finalStage的創建與Stage的劃分 157
5.4.3 創建Job 163
5.4.4 提交Stage 164
5.4.5 提交Task 165
5.5 執行任務 176
5.5.1 狀態更新 176
5.5.2 任務還原 177
5.5.3 任務運行 178
5.6 任務執行後續處理 179
5.6.1 計量統計與執行結果序列化 179
5.6.2 記憶體回收 180
5.6.3 執行結果處理 181
5.7 小結 187
第6章 計算引擎 188
6.1 疊代計算 188
6.2 什麼是shuffle 192
6.3 map端計算結果快取處理 194
6.3.1 map端計算結果快取聚合 195
6.3.2 map端計算結果簡單快取 200
6.3.3 容量限制 201
6.4 map端計算結果持久化 204
6.4.1 溢出分區檔案 205
6.4.2排序與分區分組 207
6.4.3 分區索引檔案 209
6.5 reduce端讀取中間計算結果 210
6.5.1 獲取map任務狀態 213
6.5.2 劃分本地與遠程Block 215
6.5.3 獲取遠程Block 217
6.5.4 獲取本地Block 218
6.6 reduce端計算 219
6.6.1 如何同時處理多個map任務的中間結果 219
6.6.2 reduce端在快取中對中間計算結果執行聚合和排序 220
6.7 map端與reduce端組合分析 221
6.7.1 在map端溢出分區檔案,在reduce端合併組合 221
6.7.2 在map端簡單快取、排序分組,在reduce端合併組合 222
6.7.3 在map端快取中聚合、排序分組,在reduce端組合 222
6.8 小結 223
第7章 部署模式 224
7.1 local部署模式 225
7.2 local-cluster部署模式 225
7.2.1 LocalSparkCluster的啟動 226
7.2.2 CoarseGrainedSchedulerBackend的啟動 236
7.2.3 啟動AppClient 237
7.2.4 資源調度 242
7.2.5 local-cluster模式的任務執行 253
7.3 Standalone部署模式 255
7.3.1 啟動Standalone模式 255
7.3.2 啟動Master分析 257
7.3.3 啟動Worker分析 259
7.3.4 啟動Driver Application分析 261
7.3.5 Standalone模式的任務執行 263
7.3.6 資源回收 263
7.4 容錯機制 266
7.4.1 Executor異常退出 266
7.4.2 Worker異常退出 268
7.4.3 Master異常退出 269
7.5 其他部署方案 276
7.5.1 YARN 277
7.5.2 Mesos 280
7.6 小結 282
擴 展 篇
第8章 Spark SQL 284
8.1 Spark SQL總體設計 284
8.1.1 傳統關係型資料庫SQL運行原理 285
8.1.2 Spark SQL運行架構 286
8.2 字典表Catalog 288
8.3 Tree和TreeNode 289
8.4 詞法解析器Parser的設計與實現 293
8.4.1 SQL語句解析的入口 294
8.4.2 建表語句解析器DDLParser 295
8.4.3 SQL語句解析器SqlParser 296
8.4.4 Spark代理解析器SparkSQLParser 299
8.5 Rule和RuleExecutor 300
8.6 Analyzer與Optimizer的設計與實現 302
8.6.1 語法分析器Analyzer 304
8.6.2 最佳化器Optimizer 305
8.7 生成物理執行計畫 306
8.8 執行物理執行計畫 308
8.9 Hive 311
8.9.1 Hive SQL語法解析器 311
8.9.2 Hive SQL元數據分析 313
8.9.3 Hive SQL物理執行計畫 314
8.10 套用舉例:JavaSparkSQL 314
8.11 小結 320
第9章 流式計算 321
9.1 Spark Streaming總體設計 321
9.2 StreamingContext初始化 323
9.3 輸入流接收器規範Receiver 324
9.4 數據流抽象DStream 325
9.4.1 Dstream的離散化 326
9.4.2 數據源輸入流InputDStream 327
9.4.3 Dstream轉換及構建DStream Graph 329
9.5 流式計算執行過程分析 330
9.5.1 流式計算例子CustomReceiver 331
9.5.2 Spark Streaming執行環境構建 335
9.5.3 任務生成過程 347
9.6 視窗操作 355
9.7 套用舉例 357
9.7.1 安裝mosquitto 358
9.7.2 啟動mosquitto 358
9.7.3 MQTTWordCount 359
9.8 小結 361
第10章 圖計算 362
10.1 Spark GraphX總體設計 362
10.1.1 圖計算模型 363
10.1.2 屬性圖 365
10.1.3 GraphX的類繼承體系 367
10.2 圖操作 368
10.2.1 屬性操作 368
10.2.2 結構操作 368
10.2.3 連線操作 369
10.2.4 聚合操作 370
10.3 Pregel API 371
10.3.1 Dijkstra算法 373
10.3.2 Dijkstra的實現 376
10.4 Graph的構建 377
10.4.1 從邊的列表載入Graph 377
10.4.2 在Graph中創建圖的方法 377
10.5 頂點集合抽象VertexRDD 378
10.6 邊集合抽象EdgeRDD 379
10.7 圖分割 380
10.8 常用算法 382
10.8.1 網頁排名 382
10.8.2 Connected Components的套用 386
10.8.3 三角關係統計 388
10.9 套用舉例 390
10.10 小結 391
第11章 機器學習 392
11.1 機器學習概論 392
11.2 Spark MLlib總體設計 394
11.3 數據類型 394
11.3.1 局部向量 394
11.3.2 標記點 395
11.3.3 局部矩陣 396
11.3.4 分散式矩陣 396
11.4 基礎統計 398
11.4.1 摘要統計 398
11.4.2 相關統計 399
11.4.3 分層抽樣 401
11.4.4 假設檢驗 401
11.4.5 隨機數生成 402
11.5 分類和回歸 405
11.5.1 數學公式 405
11.5.2 線性回歸 407
11.5.3 分類 407
11.5.4 回歸 410
11.6 決策樹 411
11.6.1 基本算法 411
11.6.2 使用例子 412
11.7 隨機森林 413
11.7.1 基本算法 414
11.7.2 使用例子 414
11.8 梯度提升決策樹 415
11.8.1 基本算法 415
11.8.2 使用例子 416
11.9 樸素貝葉斯 416
11.9.1 算法原理 416
11.9.2 使用例子 418
11.10 保序回歸 418
11.10.1 算法原理 418
11.10.2 使用例子 419
11.11 協同過濾 419
11.12 聚類 420
11.12.1 K-means 420
11.12.2 高斯混合 422
11.12.3 快速疊代聚類 422
11.12.4 latent Dirichlet allocation 422
11.12.5 流式K-means 423
11.13 維數減縮 424
11.13.1 奇異值分解 424
11.13.2 主成分分析 425
11.14 特徵提取與轉型 425
11.14.1 術語頻率反轉 425
11.14.2 單詞向量轉換 426
11.14.3 標準尺度 427
11.14.4 正規化尺度 428
11.14.5 卡方特徵選擇器 428
11.14.6 Hadamard積 429
11.15 頻繁模式挖掘 429
11.16 預言模型標記語言 430
11.17 管道 431
11.17.1 管道工作原理 432
11.17.2 管道API介紹 433
11.17.3 交叉驗證 435
11.18 小結 436
附錄A Utils 437
附錄B Akka 446
附錄C Jetty 450
附錄D Metrics 453
附錄E Hadoop word count 456
附錄F CommandUtils 458
附錄G Netty 461
附錄H 源碼編譯錯誤 465