深入理解SPARK

深入理解SPARK

《深入理解SPARK:核心思想與源碼分析》結合大量圖和示例,對Spark的架構、部署模式和工作模組的設計理念、實現源碼與使用技巧進行了深入的剖析與解讀。 本書特色: 按照源碼分析的習慣設計,條分縷析。 多圖、多示例,幫讀者快速在頭腦中“建模”。 原理與實現剖析,幫助讀者提升架構設計、程式設計等方面的能力。 儘可能保留較多的源碼,方便離線和移動環境的閱讀。

內容簡介

《深入理解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.1K-means 420

11.12.2高斯混合 422

11.12.3快速疊代聚類 422

11.12.4latent 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.6Hadamard積 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

相關詞條

相關搜尋

熱門詞條

聯絡我們