標籤:

Spark大數據商業實戰三部曲:內核解密|商業案例|性能調優、王家林、2018清華大學出版

2018年新春報喜!熱烈祝賀王家林大咖大數據經典傳奇著作《SPARK大數據商業實戰三部曲》暢銷書籍 清華大學出版社發行上市!

王家林大咖2018年清華大學出版新書《Spark大數據商業實戰三部曲》( Spark內核解密、Spark商業案例實戰、Spark性能調優)。本書基於Spark 2.2.0最新版本(2017年7月11日發布),以Spark商業案例實戰和Spark在生產環境下幾乎所有類型的性能調優為核心,以Spark內核解密為基石,分為上篇、中篇、下篇,對企業生產環境下的Spark商業案例與性能調優抽絲剝繭地進行剖析。上篇基於Spark源碼,從一個動手實戰案例入手,循序漸進地全面解析了Spark 2.2新特性及Spark內核源碼;中篇選取Spark開發中最具有代表的經典學習案例,深入淺出地介紹,在案例中綜合應用Spark的大數據技術;下篇性能調優內容基本完全覆蓋了Spark在生產環境下的所有調優技術。本書適合所有Spark學習者和從業人員使用。對於有分散式計算框架應用經驗的人員,本書也可以作為Spark高手修鍊的參考書籍。同時,本書也特別適合作為高等院校的大數據教材使用。

書名:Spark大數據商業實戰三部曲:內核解密|商業案例|性能調優 作者:王家林 段智華 夏陽 ISBN:9787302489627 類別:大數據 頁數:1000多頁 定 價:299 出版社:清華大學出版社 出版時間:2018年02月 裝幀:精裝 開本:16開

清華大學出版社官方旗艦店(天貓)、京東、噹噹網、亞馬遜等網店已可購買!歡迎大家購買學習!

清華大學出版社官方旗艦店(天貓)

【官方正版】 Spark大數據商業實戰三部曲:內核解密|商業案例|性能調優 王家林 段智華 夏陽清 華大學出版社 9787302489627

京東網購地址:

《Spark大數據商業實戰三部曲:內核解密|商業案例|性能調優》(王家林,段智華,夏陽)【摘要 書評 試讀】- 京東圖書

噹噹網址:

《Spark大數據商業實戰三部曲:內核解密|商業案例|性能調優》(王家林、段智華、夏陽)【簡介_書評_在線閱讀】 - 噹噹圖書

作者簡介

王家林

中國著名的Spark培訓專家,Apache Spark、Android 技術中國區佈道師,DT大數據夢工廠創始人和首席專家,Android軟硬體整合專家。深入研究了Spark從 0.5.0 到 2.2.1 中共31個版本的Spark源碼,目前致力於開發優化的Spark中國版本。尤其擅長Spark在生產環境下各種類型和場景故障的排除和解決,痴迷於Spark在生產環境下任意類型(例如Shuffle和各種內存問題及數據傾斜問題等)的深度性能優化。

段智華

就職於中國電信股份有限公司上海分公司,系統架構師,CSDN博客專家。專註於Spark大數據技術研發及推廣,跟隨Spark核心源碼技術的發展,深入研究Spark 2.1.1版本及Spark 2.2.1版本的源碼優化,對Spark大數據處理、機器學習等技術領域有豐富的實戰經驗和濃厚興趣。

編輯推薦

基於Spark2.2.X版本,分為內核解密篇,商業案例篇,性能調優篇,共31章,學習過程中有任何疑問,可加入QQ群,有專業人員答疑解惑。

內容簡介

《Spark大數據商業實戰三部曲:內核解密|商業案例|性能調優》基於Spark 2.2.X,以Spark商業案例實戰和Spark在生產環境下幾乎所有類型的性能調優為核心,以Spark內核解密為基石,分為上篇、中篇、下篇,對企業生產環境下的Spark商業案例與性能調優抽絲剝繭地進行剖析。上篇基於Spark源碼,從一個動手實戰案例入手,循序漸進地全面解析了Spark 2.2新特性及Spark內核源碼;中篇選取Spark開發中*有代表的經典學習案例,深入淺出地介紹,在案例中綜合應用Spark的大數據技術;下篇性能調優內容基本完全覆蓋了Spark在生產環境下的所有調優技術。

目 錄

上篇 內核解密

第1章 電光石火間體驗Spark 2.2開發實戰... 2

1.1 通過RDD實戰電影點評系統入門及源碼閱讀... 2

1.1.1 Spark核心概念圖解... 2

1.1.2 通過RDD實戰電影點評系統案例... 4

1.2 通過DataFrame和DataSet實戰電影點評系統... 7

1.2.1 通過DataFrame實戰電影點評系統案例... 7

1.2.2 通過DataSet實戰電影點評系統案例... 10

1.3 Spark 2.2源碼閱讀環境搭建及源碼閱讀體驗... 11

第2章 Spark 2.2技術及原理... 14

2.1 Spark 2.2綜述... 14

2.1.1 連續應用程序... 14

2.1.2 新的API 15

2.2 Spark 2.2 Core. 16

2.2.1 第二代Tungsten引擎... 16

2.2.2 SparkSession. 16

2.2.3 累加器API 17

2.3 Spark 2.2 SQL. 19

2.3.1 Spark SQL. 20

2.3.2 DataFrame和Dataset API 20

2.3.3 Timed Window.. 21

2.4 Spark 2.2 Streaming. 21

2.4.1 Structured Streaming. 21

2.4.2 增量輸出模式... 23

2.5 Spark 2.2 MLlib. 27

2.5.1 基於DataFrame的Machine Learning API 28

2.5.2 R的分散式演算法... 28

2.6 Spark 2.2 GraphX.. 29

第3章 Spark的靈魂:RDD和DataSet 30

3.1 為什麼說RDD和DataSet是Spark的靈魂... 30

3.1.1 RDD的定義及五大特性剖析... 30

3.1.2 DataSet的定義及內部機制剖析... 34

3.2 RDD彈性特性七個方面解析... 36

3.3 RDD依賴關係... 43

3.3.1 窄依賴解析... 43

3.3.2 寬依賴解析... 45

3.4 解析Spark中的DAG邏輯視圖... 46

3.4.1 DAG生成的機制... 46

3.4.2 DAG邏輯視圖解析... 47

3.5 RDD內部的計算機制... 49

3.5.1 Task解析... 49

3.5.2 計算過程深度解析... 49

3.6 Spark RDD容錯原理及其四大核心要點解析... 57

3.6.1 Spark RDD容錯原理... 57

3.6.2 RDD容錯的四大核心要點... 57

3.7 Spark RDD中Runtime流程解析... 59

3.7.1 Runtime架構圖... 59

3.7.2 生命周期... 60

3.8 通過WordCount實戰解析Spark RDD內部機制... 70

3.8.1 Spark WordCount動手實踐... 70

3.8.2 解析RDD生成的內部機制... 72

3.9 基於DataSet的代碼到底是如何一步步轉化成為RDD的... 78

第4章 Spark Driver啟動內幕剖析... 81

4.1 Spark Driver Program剖析... 81

4.1.1 Spark Driver Program.. 81

4.1.2 SparkContext深度剖析... 81

4.1.3 SparkContext源碼解析... 82

4.2 DAGScheduler解析... 96

4.2.1 DAG的定義... 96

4.2.2 DAG的實例化... 97

4.2.3 DAGScheduler劃分Stage的原理... 98

4.2.4 DAGScheduler劃分Stage的具體演算法... 99

4.2.5 Stage內部Task獲取最佳位置的演算法... 113

4.3 TaskScheduler解析... 116

4.3.1 TaskScheduler原理剖析... 116

4.3.2 TaskScheduler源碼解析... 117

4.4 SchedulerBackend解析... 132

4.4.1 SchedulerBackend原理剖析... 132

4.4.2 SchedulerBackend源碼解析... 132

4.4.3 Spark程序的註冊機制... 133

4.4.4 Spark程序對計算資源Executor的管理... 134

4.5 打通Spark系統運行內幕機制循環流程... 135

4.6 本章總結... 145

第5章 Spark集群啟動原理和源碼詳解... 146

5.1 Master啟動原理和源碼詳解... 146

5.1.1 Master啟動的原理詳解... 146

5.1.2 Master啟動的源碼詳解... 147

5.1.3 Master HA雙機切換... 157

5.1.4 Master的註冊機制和狀態管理解密... 163

5.2 Worker啟動原理和源碼詳解... 170

5.2.1 Worker啟動的原理流程... 170

5.2.2 Worker啟動的源碼詳解... 174

5.3 ExecutorBackend啟動原理和源碼詳解... 178

5.3.1 ExecutorBackend介面與Executor的關係... 178

5.3.2 ExecutorBackend的不同實現... 179

5.3.3 ExecutorBackend中的通信... 181

5.3.4 ExecutorBackend的異常處理... 183

5.4 Executor中任務的執行... 184

5.4.1 Executor中任務的載入... 184

5.4.2 Executor中的任務線程池... 185

5.4.3 任務執行失敗處理... 186

5.4.4 揭秘TaskRunner 188

5.5 Executor執行結果的處理方式... 189

5.6 本章總結... 197

第6章 Spark Application提交給集群的原理和源碼詳解... 198

6.1 Spark Application到底是如何提交給集群的... 198

6.1.1 Application提交參數配置詳解... 198

6.1.2 Application提交給集群原理詳解... 199

6.1.3 Application提交給集群源碼詳解... 201

6.2 Spark Application是如何向集群申請資源的... 211

6.2.1 Application申請資源的兩種類型詳解... 211

6.2.2 Application申請資源的源碼詳解... 213

6.3 從Application提交的角度重新審視Driver 219

6.3.1 Driver到底是什麼時候產生的... 220

6.3.2 Driver和Master交互原理解析... 238

6.3.3 Driver和Master交互源碼詳解... 244

6.4 從Application提交的角度重新審視Executor 249

6.4.1 Executor到底是什麼時候啟動的... 249

6.4.2 Executor如何把結果交給Application. 254

6.5 Spark 1.6 RPC內幕解密:運行機制、源碼詳解、Netty與Akka等... 254

6.6 本章總結... 267

第7章 Shuffle原理和源碼詳解... 268

7.1 概述... 268

7.2 Shuffle的框架... 269

7.2.1 Shuffle的框架演進... 269

7.2.2 Shuffle的框架內核... 270

7.2.3 Shuffle框架的源碼解析... 272

7.2.4 Shuffle數據讀寫的源碼解析... 275

7.3 Hash Based Shuffle. 281

7.3.1 概述... 281

7.3.2 Hash Based Shuffle內核... 282

7.3.3 Hash Based Shuffle數據讀寫的源碼解析... 285

7.4 Sorted Based Shuffle. 290

7.4.1 概述... 292

7.4.2 Sorted Based Shuffle內核... 293

7.4.3 Sorted Based Shuffle數據讀寫的源碼解析... 294

7.5 Tungsten Sorted Based Shuffle. 302

7.5.1 概述... 302

7.5.2 Tungsten Sorted Based Shuffle內核... 302

7.5.3 Tungsten Sorted Based Shuffle數據讀寫的源碼解析... 303

7.6 Shuffle與Storage 模塊間的交互... 309

7.6.1 Shuffle註冊的交互... 310

7.6.2 Shuffle寫數據的交互... 314

7.6.3 Shuffle讀數據的交互... 315

7.6.4 BlockManager架構原理、運行流程圖和源碼解密... 315

7.6.5 BlockManager解密進階:BlockManager初始化和註冊解密、BlockManager- Master工作解密、BlockTransferService解密、本地數據讀寫解密、遠程數據讀寫解密... 324

7.7 本章總結... 341

第8章 Job工作原理和源碼詳解... 342

8.1 Job到底在什麼時候產生... 342

8.1.1 觸發Job的原理和源碼解析... 342

8.1.2 觸發Job的運算元案例... 344

8.2 Stage劃分內幕... 345

8.2.1 Stage劃分原理詳解... 345

8.2.2 Stage劃分源碼詳解... 346

8.3 Task全生命周期詳解... 346

8.3.1 Task的生命過程詳解... 347

8.3.2Task在Driver和Executor中交互的全生命周期原理和源碼詳解... 348

8.4 ShuffleMapTask和ResultTask處理結果是如何被Driver管理的... 364

8.4.1 ShuffleMapTask執行結果和Driver的交互原理及源碼詳解... 364

8.4.2ResultTask執行結果與Driver的交互原理及源碼詳解... 370

第9章 Spark中Cache和checkpoint原理和源碼詳解... 372

9.1 Spark中Cache原理和源碼詳解... 372

9.1.1 Spark中Cache原理詳解... 372

9.1.2 Spark中Cache源碼詳解... 372

9.2 Spark中checkpoint原理和源碼詳解... 381

9.2.1 Spark中checkpoint原理詳解... 381

9.2.2 Spark中checkpoint源碼詳解... 381

第10章 Spark中Broadcast和Accumulator原理和源碼詳解... 391

10.1 Spark中Broadcast原理和源碼詳解... 391

10.1.1 Spark中Broadcast原理詳解... 391

10.1.2 Spark中Broadcast源碼詳解... 393

10.2 Spark中Accumulator原理和源碼詳解... 396

10.2.1 Spark中Accumulator原理詳解... 396

10.2.2 Spark中Accumulator源碼詳解... 396

第11章 Spark與大數據其他經典組件整合原理與實戰... 399

11.1 Spark組件綜合應用... 399

11.2 Spark與Alluxio整合原理與實戰... 400

11.2.1 Spark與Alluxio整合原理... 400

11.2.2 Spark與Alluxio整合實戰... 401

11.3 Spark與Job Server整合原理與實戰... 403

11.3.1 Spark與Job Server整合原理... 403

11.3.2 Spark與Job Server整合實戰... 404

11.4 Spark與Redis整合原理與實戰... 406

11.4.1 Spark與Redis整合原理... 406

11.4.2 Spark與Redis整合實戰... 407

中篇 商業案例

第12章 Spark商業案例之大數據電影點評系統應用案例... 412

12.1 通過RDD實現分析電影的用戶行為信息... 412

12.1.1 搭建IDEA開發環境... 412

12.1.2 大數據電影點評系統中電影數據說明... 425

12.1.3 電影點評系統用戶行為分析統計實戰... 428

12.2 通過RDD實現電影流行度分析... 431

12.3 通過RDD分析各種類型的最喜愛電影TopN及性能優化技巧... 433

12.4 通過RDD分析電影點評系統仿QQ和微信等用戶群分析及廣播

  背後機制解密... 436

12.5 通過RDD分析電影點評系統實現Java和Scala版本的二次排序系統... 439

12.5.1 二次排序自定義Key值類實現(Java)... 440

12.5.2 電影點評系統二次排序功能實現(Java)... 442

12.5.3 二次排序自定義Key值類實現(Scala)... 445

12.5.4 電影點評系統二次排序功能實現(Scala)... 446

12.6 通過Spark SQL中的SQL語句實現電影點評系統用戶行為分析... 447

12.7 通過Spark SQL下的兩種不同方式實現口碑最佳電影分析... 451

12.8 通過Spark SQL下的兩種不同方式實現最流行電影分析... 456

12.9 通過DataFrame分析最受男性和女性喜愛電影TopN.. 457

12.10 純粹通過DataFrame分析電影點評系統仿QQ和微信、淘寶等用戶群... 460

12.11 純粹通過DataSet對電影點評系統進行流行度和不同年齡階段興趣分析等... 462

12.11.1 通過DataSet實現某特定電影觀看者中男性和女性不同年齡的人數... 463

12.11.2 通過DataSet方式計算所有電影中平均得分最高

  (口碑最好)的電影TopN.. 464

12.11.3 通過DataSet方式計算所有電影中粉絲或者觀看人數最多(最流行電影)的電影TopN 465

12.11.4 純粹通過DataSet的方式實現所有電影中最受男性、女性喜愛的

  電影Top10. 466

12.11.5純粹通過DataSet的方式實現所有電影中QQ或者微信核心目標

  用戶最喜愛電影TopN分析... 467

12.11.6 純粹通過DataSet的方式實現所有電影中淘寶核心目標用戶最喜愛電影TopN分析 469

12.12 大數據電影點評系統應用案例涉及的核心知識點原理、源碼及案例代碼... 470

12.12.1 知識點:廣播變數Broadcast內幕機制... 470

12.12.2 知識點:SQL全局臨時視圖及臨時視圖... 473

12.12.3 大數據電影點評系統應用案例完整代碼... 474

12.13 本章總結... 496

前 言

大數據像當年的石油、人工智慧(Artificial Intelligence)像當年的電力一樣,正以前所未有的廣度和深度影響所有的行業,現在及未來公司的核心壁壘是數據,核心競爭力來自基於大數據的人工智慧的競爭。Spark是當今大數據領域最活躍、最熱門、最高效的大數據通用計算平台,2009年誕生於美國加州大學伯克利分校AMP實驗室,2010年正式開源,2013年成為Apache基金項目,2014年成為Apache基金的頂級項目。基於RDD,Spark成功構建起了一體化、多元化的大數據處理體系。

  在任何規模的數據計算中,Spark在性能和擴展性上都更具優勢。

  (1)Hadoop之父Doug Cutting指出:Useof MapReduce engine for Big Data projects will decline, replaced by ApacheSpark(大數據項目的MapReduce引擎的使用將下降,由Apache Spark取代。)

  (2)Hadoop商業發行版本的市場領導者Cloudera、HortonWorks、MapR紛紛轉投Spark,並把Spark作為大數據解決方案的首選和核心計算引擎。

  2014年的Sort Benchmark測試中,Spark秒殺Hadoop,在使用十分之一計算資源的情況下,相同數據的排序上,Spark比MapReduce快3倍!在沒有官方PB排序對比的情況下,首次將Spark推到了1PB數據(十萬億條記錄)的排序,在使用190個節點的情況下,工作負載在4小時內完成,同樣遠超雅虎之前使用3800台主機耗時16個小時的記錄。

免費在線閱讀

第3章 Spark的靈魂:RDD和DataSet

本章重點講解Spark的RDD和DataSet。

3.1節講解RDD的定義、五大特性剖析及DataSet的定義和內部機制剖析;

3.2節對RDD彈性特性七個方面進行解析;

3.3節講解RDD依賴關係,包括窄依賴、寬依賴;

3.4節解析Spark中DAG邏輯視圖;

3.5節對RDD內部的計算機制及計算過程進行深度解析;

3.6節講解Spark RDD容錯原理及其四大核心要點解析;

3.7節對Spark RDD中Runtime流程進行解析;

3.8節通過一個WordCount實例,解析Spark RDD內部機制;

3.9節基於DataSet的代碼,深入分析DataSet一步步轉化成為RDD的過程。

3.1 為什麼說RDD和DataSet是Spark的靈魂

Spark建立在抽象的RDD上,使得它可以用一致的方式處理大數據不同的應用場景,把所有需要處理的數據轉化成為RDD,然後對RDD進行一系列的運算元運算,從而得到結果。RDD是一個容錯的、並行的數據結構,可以將數據存儲到內存和磁碟中,並能控制數據分區,且提供了豐富的API來操作數據。Spark一體化、多元化的解決方案極大地減少了開發和維護的人力成本和部署平台的物力成本,並在性能方面有極大的優勢,特別適合於迭代計算,如機器學習和圖計算;同時,Spark對Scala和Python互動式shell的支持也極大地方便了通過shell直接使用Spark集群來驗證解決問題的方法,這對於原型開發至關重要,對數據分析人員有著無法拒絕的吸引力。

3.1.1 RDD的定義及五大特性剖析

RDD是分散式內存的一個抽象概念,是一種高度受限的共享內存模型,即RDD是只讀的記錄分區的集合,能橫跨集群所有節點並行計算,是一種基於工作集的應用抽象。

RDD底層存儲原理:其數據分布存儲於多台機器上,事實上,每個RDD的數據都以Block的形式存儲於多台機器上,每個Executor會啟動一個BlockManagerSlave,並管理一部分Block;而Block的元數據由Driver節點上的BlockManagerMaster保存,BlockManagerSlave生成Block後向BlockManagerMaster註冊該Block,BlockManagerMaster管理RDD與Block的關係,當RDD不再需要存儲的時候,將向BlockManagerSlave發送指令刪除相應的Block。 BlockManager管理RDD的物理分區,每個Block就是節點上對應的一個數據塊,可以存儲在內存或者磁碟上。而RDD中的Partition是一個邏輯數據塊,對應相應的物理塊Block。本質上,一個RDD在代碼中相當於數據的一個元數據結構,存儲著數據分區及其邏輯結構映射關係,存儲著RDD之前的依賴轉換關係。

BlockManager在每個節點上運行管理Block(Driver和Executors),它提供一個介面檢索本地和遠程的存儲變數,如memory、disk、off-heap。使用BlockManager前必須先初始化。

BlockManager.scala的部分源碼如下所示。

1. private[spark] class BlockManager(

2. executorId: String,

3. rpcEnv: RpcEnv,

4. val master: BlockManagerMaster,

5. val serializerManager: SerializerManager,

6. val conf: SparkConf,

7. memoryManager: MemoryManager,

8. mapOutputTracker: MapOutputTracker,

9. shuffleManager: ShuffleManager,

10. val blockTransferService: BlockTransferService,

11. securityManager: SecurityManager,

12. numUsableCores: Int)13. extends BlockDataManager with BlockEvictionHandler with Logging {

BlockManagerMaster會持有整個Application的Block的位置、Block所佔用的存儲空間等元數據信息,在Spark的Driver的DAGScheduler中,就是通過這些信息來確認數據運行的本地性的。Spark支持重分區,數據通過Spark默認的或者用戶自定義的分區器決定數據塊分布在哪些節點。RDD的物理分區是由Block-Manager管理的,每個Block就是節點上對應的一個數據塊,可以存儲在內存或者磁碟。而RDD中的partition是一個邏輯數據塊,對應相應的物理塊Block。

本質上,一個RDD在代碼中相當於數據的一個元數據結構(一個RDD就是一組分區),存儲著數據分區及Block、Node等的映射關係,以及其他元數據信息,存儲著RDD之前的依賴轉換關係。分區是一個邏輯概念,Transformation前後的新舊分區在物理上可能是同一塊內存存儲。

Spark通過讀取外部數據創建RDD,或通過其他RDD執行確定的轉換Transformation操作(如map、union和groubByKey)而創建,從而構成了線性依賴關係,或者說血統關係(Lineage),在數據分片丟失時可以從依賴關係中恢復自己獨立的數據分片,對其他數據分片或計算機沒有影響,基本沒有檢查點開銷,使得實現容錯的開銷很低,失效時只需要重新計算RDD分區,就可以在不同節點上並行執行,而不需要回滾(Roll Back)整個程序。落後任務(即運行很慢的節點)是通過任務備份,重新調用執行進行處理的。 因為RDD本身支持基於工作集的運用,所以可以使Spark的RDD持久化(persist)到內存中,在並行計算中高效重用。多個查詢時,我們就可以顯性地將工作集中的數據緩存到內存中,為後續查詢提供復用,這極大地提升了查詢的速度。在Spark中,一個RDD就是一個分散式對象集合,每個RDD可分為多個片(Partitions),而分片可以在集群環境的不同節點上計算。

RDD作為泛型的抽象的數據結構,支持兩種計算操作運算元:Transformation(變換)與Action(行動)。且RDD的寫操作是粗粒度的,讀操作既可以是粗粒度的,也可以是細粒度的。

2018年新春報喜!熱烈祝賀王家林大咖大數據經典傳奇著作《SPARK大數據商業實戰三部曲》 暢銷書籍 清華大學出版社發行上市!

我們一直在努力!我們所有的努力都註定成為傳奇!

家林大咖將在2018年3月下旬會繼續推出新課程,核心聚焦在機器學習和深度學習上!

新夢想!新征程!歡迎大家加入!


推薦閱讀:

Spark里的DAG是怎麼回事?
Spark Core源碼分析--任務提交
Spark源碼分析(1) RDD是什麼
Spark基礎性能優化

TAG:Spark |