《Spark大數據商業實戰三部曲:內核解密|商業案例|性能調優》基于Spark 2.2.X,以Spark商業案例實戰和Spark在生產環境下幾乎所有類型的性能調優為核心,以Spark內核解密為基石,分為上篇、中篇、下篇,對企業生產環境下的Spark商業案例與性能調優抽絲剝繭地進行剖析。上篇基于Spark源碼,從一個動手實戰案例入手,循序漸進地全面解析了Spark 2.2新特性及Spark內核源碼;中篇選取Spark開發中*有代表的經典學習案例,深入淺出地介紹,在案例中綜合應用Spark的大數據技術;下篇性能調優內容基本完全覆蓋了Spark在生產環境下的所有調優技術。
前 言
大數據像當年的石油、人工智能(Artificial Intelligence)像當年的電力一樣,正以前所未有的廣度和深度影響所有的行業,現在及未來公司的核心壁壘是數據,核心競爭力來自基于大數據的人工智能的競爭。Spark是當今大數據領域最活躍、最熱門、最高效的大數據通用計算平臺,2009年誕生于美國加州大學伯克利分校AMP實驗室,2010年正式開源,2013年成為Apache基金項目,2014年成為Apache基金的頂級項目。基于RDD,Spark成功構建起了一體化、多元化的大數據處理體系。
在任何規模的數據計算中,Spark在性能和擴展性上都更具優勢。
(1)Hadoop之父Doug Cutting指出:Use
of MapReduce engine for Big Data projects will decline, replaced by Apache
Spark(大數據項目的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個小時的記錄。
2015年6月,Spark最大的集群來自騰訊8000個節點,單個Job最大分別是阿里巴巴和Databricks1PB,震撼人心!同時,Spark的Contributor比2014年漲了3倍,達到730人;總代碼行數也比2014年漲了2倍多,達到40萬行。IBM于2015年6月承諾大力推進Apache Spark項目,并稱該項目為:以數據為主導的,未來十年最重要的新的開源項目。這一承諾的核心是將Spark嵌入IBM業內領先的分析和商務平臺,并將Spark作為一項服務,在IBMBluemix平臺上提供給客戶。IBM還將投入超過3500名研究和開發人員在全球10余個實驗室開展與Spark相關的項目,并將為Spark開源生態系統無償提供突破性的機器學習技術IBM SystemML。同時,IBM還將培養超過100萬名Spark數據科學家和數據工 程師。
2016年,在有計算界奧運會之稱的國際著名Sort
Benchmark 全球數據排序大賽中,由南京大學計算機科學與技術系PASA大數據實驗室、阿里巴巴和Databricks公司組成的參賽團隊NADSort,以144美元的成本完成100TB標準數據集的排序處理,創下了每TB數據排序1.44美元成本的最新世界紀錄,比2014年奪得冠軍的加州大學圣地亞哥分校TritonSort團隊每TB數據4.51美元的成本降低了近70%,而這次比賽依舊使用Apache Spark大數據計算平臺,在大規模并行排序算法以及Spark系統底層進行了大量的優化,以盡可能提高排序計算性能并降低存儲資源開銷,確保最終贏得比賽。
在Full Stack理想的指引下,Spark中的Spark SQL、SparkStreaming、MLLib、GraphX、R五大子框架和庫之間可以無縫地共享數據和操作,這不僅打造了Spark在當今大數據計算領域其他計算框架都無可匹敵的優勢,而且使得Spark正在加速成為大數據處理中心首選通用計算平臺,而Spark商業案例和性能優化必將成為接下來的重中之重!
本書根據王家林老師親授課程及結合眾多大數據項目經驗編寫而成,其中王家林、段智華編寫了本書近90%的內容,具體編寫章節如下:
第3章 Spark的靈魂:RDD和DataSet;
第4章 Spark Driver啟動內幕剖析;
第5章 Spark集群啟動原理和源碼詳解;
第6章 Spark Application提交給集群的原理和源碼詳解;
第7章 Shuffle原理和源碼詳解;
第8章 Job工作原理和源碼詳解;
第9章 Spark中Cache和checkpoint原理和源碼詳解;
第10章 Spark中Broadcast和Accumulator原理和源碼詳解;
第11章 Spark與大數據其他經典組件整合原理與實戰;
第12章 Spark商業案例之大數據電影點評系統應用案例;
第13章 Spark 2.2實戰之Dataset開發實戰企業人員管理系統應用案例;
第14章 Spark商業案例之電商交互式分析系統應用案例;
第15章 Spark商業案例之NBA籃球運動員大數據分析系統應用案例;
第16章 電商廣告點擊大數據實時流處理系統案例;
第17章 Spark在通信運營商生產環境中的應用案例;
第18章 使用Spark
GraphX實現婚戀社交網絡多維度分析案例;
第23章Spark集群中Mapper端、Reducer端內存調優;
第24章 使用Broadcast實現Mapper端Shuffle聚合功能的原理和調優實戰;
第25章 使用Accumulator高效地實現分布式集群全局計數器的原理和調優案例;
第27章 Spark五大子框架調優最佳實踐;
第28章 Spark 2.2.0新一代鎢絲計劃優化引擎;
第30章 Spark性能調優之數據傾斜調優一站式解決方案原理與實戰;
第31章 Spark大數據性能調優實戰專業之路。
其中,段智華根據自身多年的大數據工作經驗對本書的案例等部分進行了擴展。
除上述章節外,剩余內容由夏陽、鄭采翎、閆恒偉三位作者根據王家林老師的大數據授課內容而完成。
在閱讀本書的過程中,如發現任何問題或有任何疑問,可以加入本書的閱讀群(QQ:418110145)討論,會有專人答疑。同時,該群也會提供本書所用案例源碼及本書的配套學習視頻。
如果讀者想要了解或者學習更多大數據相關技術,可以關注DT大數據夢工廠微信公眾號DT_Spark,也可以通過YY客戶端登錄68917580永久頻道直接體驗。
王家林老師的新浪微博是http://weibo.com/ilovepains/ 歡迎大家在微博上與作者進行 互動。
由于時間倉促,書中難免存在不妥之處,請讀者諒解,并提出寶貴意見。
王家林2017年中秋之夜于美國硅谷
目 錄
上篇 內核解密
第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.2 Task在Driver和Executor中交互的全生命周期原理和源碼詳解... 348
8.4 ShuffleMapTask和ResultTask處理結果是如何被Driver管理的... 364
8.4.1 ShuffleMapTask執行結果和Driver的交互原理及源碼詳解... 364
8.4.2 ResultTask執行結果與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