《Spark大數(shù)據(jù)商業(yè)實戰(zhàn)三部曲:內(nèi)核解密|商業(yè)案例|性能調(diào)優(yōu)》基于Spark 2.2.X,以Spark商業(yè)案例實戰(zhàn)和Spark在生產(chǎn)環(huán)境下幾乎所有類型的性能調(diào)優(yōu)為核心,以Spark內(nèi)核解密為基石,分為上篇、中篇、下篇,對企業(yè)生產(chǎn)環(huán)境下的Spark商業(yè)案例與性能調(diào)優(yōu)抽絲剝繭地進行剖析。上篇基于Spark源碼,從一個動手實戰(zhàn)案例入手,循序漸進地全面解析了Spark 2.2新特性及Spark內(nèi)核源碼;中篇選取Spark開發(fā)中*有代表的經(jīng)典學(xué)習(xí)案例,深入淺出地介紹,在案例中綜合應(yīng)用Spark的大數(shù)據(jù)技術(shù);下篇性能調(diào)優(yōu)內(nèi)容基本完全覆蓋了Spark在生產(chǎn)環(huán)境下的所有調(diào)優(yōu)技術(shù)。
基于*的Spark2.2.X版本,分為內(nèi)核解密篇,商業(yè)案例篇,性能調(diào)優(yōu)篇,共31章,學(xué)習(xí)過程中有任何疑問,可加入QQ群,有專業(yè)人員答疑解惑。
前 言
大數(shù)據(jù)像當年的石油、人工智能(Artificial Intelligence)像當年的電力一樣,正以前所未有的廣度和深度影響所有的行業(yè),現(xiàn)在及未來公司的核心壁壘是數(shù)據(jù),核心競爭力來自基于大數(shù)據(jù)的人工智能的競爭。Spark是當今大數(shù)據(jù)領(lǐng)域最活躍、最熱門、最高效的大數(shù)據(jù)通用計算平臺,2009年誕生于美國加州大學(xué)伯克利分校AMP實驗室,2010年正式開源,2013年成為Apache基金項目,2014年成為Apache基金的頂級項目。基于RDD,Spark成功構(gòu)建起了一體化、多元化的大數(shù)據(jù)處理體系。
在任何規(guī)模的數(shù)據(jù)計算中,Spark在性能和擴展性上都更具優(yōu)勢。
(1)Hadoop之父Doug Cutting指出:Use
of MapReduce engine for Big Data projects will decline, replaced by Apache
Spark(大數(shù)據(jù)項目的MapReduce引擎的使用將下降,由Apache Spark取代。)
(2)Hadoop商業(yè)發(fā)行版本的市場領(lǐng)導(dǎo)者Cloudera、HortonWorks、MapR紛紛轉(zhuǎn)投Spark,并把Spark作為大數(shù)據(jù)解決方案的首選和核心計算引擎。
2014年的Sort Benchmark測試中,Spark秒殺Hadoop,在使用十分之一計算資源的情況下,相同數(shù)據(jù)的排序上,Spark比MapReduce快3倍!在沒有官方PB排序?qū)Ρ鹊那闆r下,首次將Spark推到了1PB數(shù)據(jù)(十萬億條記錄)的排序,在使用190個節(jié)點的情況下,工作負載在4小時內(nèi)完成,同樣遠超雅虎之前使用3800臺主機耗時16個小時的記錄。
2015年6月,Spark最大的集群來自騰訊8000個節(jié)點,單個Job最大分別是阿里巴巴和Databricks1PB,震撼人心!同時,Spark的Contributor比2014年漲了3倍,達到730人;總代碼行數(shù)也比2014年漲了2倍多,達到40萬行。IBM于2015年6月承諾大力推進Apache Spark項目,并稱該項目為:以數(shù)據(jù)為主導(dǎo)的,未來十年最重要的新的開源項目。這一承諾的核心是將Spark嵌入IBM業(yè)內(nèi)領(lǐng)先的分析和商務(wù)平臺,并將Spark作為一項服務(wù),在IBMBluemix平臺上提供給客戶。IBM還將投入超過3500名研究和開發(fā)人員在全球10余個實驗室開展與Spark相關(guān)的項目,并將為Spark開源生態(tài)系統(tǒng)無償提供突破性的機器學(xué)習(xí)技術(shù)IBM SystemML。同時,IBM還將培養(yǎng)超過100萬名Spark數(shù)據(jù)科學(xué)家和數(shù)據(jù)工 程師。
2016年,在有計算界奧運會之稱的國際著名Sort
Benchmark 全球數(shù)據(jù)排序大賽中,由南京大學(xué)計算機科學(xué)與技術(shù)系PASA大數(shù)據(jù)實驗室、阿里巴巴和Databricks公司組成的參賽團隊NADSort,以144美元的成本完成100TB標準數(shù)據(jù)集的排序處理,創(chuàng)下了每TB數(shù)據(jù)排序1.44美元成本的最新世界紀錄,比2014年奪得冠軍的加州大學(xué)圣地亞哥分校TritonSort團隊每TB數(shù)據(jù)4.51美元的成本降低了近70%,而這次比賽依舊使用Apache Spark大數(shù)據(jù)計算平臺,在大規(guī)模并行排序算法以及Spark系統(tǒng)底層進行了大量的優(yōu)化,以盡可能提高排序計算性能并降低存儲資源開銷,確保最終贏得比賽。
在Full Stack理想的指引下,Spark中的Spark SQL、SparkStreaming、MLLib、GraphX、R五大子框架和庫之間可以無縫地共享數(shù)據(jù)和操作,這不僅打造了Spark在當今大數(shù)據(jù)計算領(lǐng)域其他計算框架都無可匹敵的優(yōu)勢,而且使得Spark正在加速成為大數(shù)據(jù)處理中心首選通用計算平臺,而Spark商業(yè)案例和性能優(yōu)化必將成為接下來的重中之重!
本書根據(jù)王家林老師親授課程及結(jié)合眾多大數(shù)據(jù)項目經(jīng)驗編寫而成,其中王家林、段智華編寫了本書近90%的內(nèi)容,具體編寫章節(jié)如下:
第3章 Spark的靈魂:RDD和DataSet;
第4章 Spark Driver啟動內(nèi)幕剖析;
第5章 Spark集群啟動原理和源碼詳解;
第6章 Spark Application提交給集群的原理和源碼詳解;
第7章 Shuffle原理和源碼詳解;
第8章 Job工作原理和源碼詳解;
第9章 Spark中Cache和checkpoint原理和源碼詳解;
第10章 Spark中Broadcast和Accumulator原理和源碼詳解;
第11章 Spark與大數(shù)據(jù)其他經(jīng)典組件整合原理與實戰(zhàn);
第12章 Spark商業(yè)案例之大數(shù)據(jù)電影點評系統(tǒng)應(yīng)用案例;
第13章 Spark 2.2實戰(zhàn)之Dataset開發(fā)實戰(zhàn)企業(yè)人員管理系統(tǒng)應(yīng)用案例;
第14章 Spark商業(yè)案例之電商交互式分析系統(tǒng)應(yīng)用案例;
第15章 Spark商業(yè)案例之NBA籃球運動員大數(shù)據(jù)分析系統(tǒng)應(yīng)用案例;
第16章 電商廣告點擊大數(shù)據(jù)實時流處理系統(tǒng)案例;
第17章 Spark在通信運營商生產(chǎn)環(huán)境中的應(yīng)用案例;
第18章 使用Spark
GraphX實現(xiàn)婚戀社交網(wǎng)絡(luò)多維度分析案例;
第23章Spark集群中Mapper端、Reducer端內(nèi)存調(diào)優(yōu);
第24章 使用Broadcast實現(xiàn)Mapper端Shuffle聚合功能的原理和調(diào)優(yōu)實戰(zhàn);
第25章 使用Accumulator高效地實現(xiàn)分布式集群全局計數(shù)器的原理和調(diào)優(yōu)案例;
第27章 Spark五大子框架調(diào)優(yōu)最佳實踐;
第28章 Spark 2.2.0新一代鎢絲計劃優(yōu)化引擎;
第30章 Spark性能調(diào)優(yōu)之數(shù)據(jù)傾斜調(diào)優(yōu)一站式解決方案原理與實戰(zhàn);
第31章 Spark大數(shù)據(jù)性能調(diào)優(yōu)實戰(zhàn)專業(yè)之路。
其中,段智華根據(jù)自身多年的大數(shù)據(jù)工作經(jīng)驗對本書的案例等部分進行了擴展。
除上述章節(jié)外,剩余內(nèi)容由夏陽、鄭采翎、閆恒偉三位作者根據(jù)王家林老師的大數(shù)據(jù)授課內(nèi)容而完成。
在閱讀本書的過程中,如發(fā)現(xiàn)任何問題或有任何疑問,可以加入本書的閱讀群(QQ:418110145)討論,會有專人答疑。同時,該群也會提供本書所用案例源碼及本書的配套學(xué)習(xí)視頻。
如果讀者想要了解或者學(xué)習(xí)更多大數(shù)據(jù)相關(guān)技術(shù),可以關(guān)注DT大數(shù)據(jù)夢工廠微信公眾號DT_Spark,也可以通過YY客戶端登錄68917580永久頻道直接體驗。
王家林老師的新浪微博是http://weibo.com/ilovepains/ 歡迎大家在微博上與作者進行 互動。
由于時間倉促,書中難免存在不妥之處,請讀者諒解,并提出寶貴意見。
王家林2017年中秋之夜于美國硅谷
目 錄
上篇 內(nèi)核解密
第1章 電光石火間體驗Spark 2.2開發(fā)實戰(zhàn)... 2
1.1 通過RDD實戰(zhàn)電影點評系統(tǒng)入門及源碼閱讀... 2
1.1.1 Spark核心概念圖解... 2
1.1.2 通過RDD實戰(zhàn)電影點評系統(tǒng)案例... 4
1.2 通過DataFrame和DataSet實戰(zhàn)電影點評系統(tǒng)... 7
1.2.1 通過DataFrame實戰(zhàn)電影點評系統(tǒng)案例... 7
1.2.2 通過DataSet實戰(zhàn)電影點評系統(tǒng)案例... 10
1.3 Spark 2.2源碼閱讀環(huán)境搭建及源碼閱讀體驗... 11
第2章 Spark
2.2技術(shù)及原理... 14
2.1 Spark 2.2綜述... 14
2.1.1 連續(xù)應(yīng)用程序... 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的定義及內(nèi)部機制剖析... 34
3.2 RDD彈性特性七個方面解析... 36
3.3 RDD依賴關(guān)系... 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內(nèi)部的計算機制... 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架構(gòu)圖... 59
3.7.2 生命周期... 60
3.8 通過WordCount實戰(zhàn)解析Spark RDD內(nèi)部機制... 70
3.8.1 Spark WordCount動手實踐... 70
3.8.2 解析RDD生成的內(nèi)部機制... 72
3.9 基于DataSet的代碼到底是如何一步步轉(zhuǎn)化成為RDD的... 78
第4章 Spark
Driver啟動內(nèi)幕剖析... 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內(nèi)部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程序?qū)τ嬎阗Y源Executor的管理... 134
4.5 打通Spark系統(tǒng)運行內(nèi)幕機制循環(huán)流程... 135
4.6 本章總結(jié)... 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的注冊機制和狀態(tài)管理解密... 163
5.2 Worker啟動原理和源碼詳解... 170
5.2.1 Worker啟動的原理流程... 170
5.2.2 Worker啟動的源碼詳解... 174
5.3 ExecutorBackend啟動原理和源碼詳解... 178
5.3.1 ExecutorBackend接口與Executor的關(guān)系... 178
5.3.2 ExecutorBackend的不同實現(xiàn)... 179
5.3.3 ExecutorBackend中的通信... 181
5.3.4 ExecutorBackend的異常處理... 183
5.4 Executor中任務(wù)的執(zhí)行... 184
5.4.1 Executor中任務(wù)的加載... 184
5.4.2 Executor中的任務(wù)線程池... 185
5.4.3 任務(wù)執(zhí)行失敗處理... 186
5.4.4 揭秘TaskRunner 188
5.5 Executor執(zhí)行結(jié)果的處理方式... 189
5.6 本章總結(jié)... 197
第6章 Spark
Application提交給集群的原理和源碼詳解... 198
6.1 Spark Application到底是如何提交給集群的... 198
6.1.1 Application提交參數(shù)配置詳解... 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到底是什么時候產(chǎn)生的... 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如何把結(jié)果交給Application. 254
6.5 Spark 1.6 RPC內(nèi)幕解密:運行機制、源碼詳解、Netty與Akka等... 254
6.6 本章總結(jié)... 267
第7章
Shuffle原理和源碼詳解... 268
7.1 概述... 268
7.2 Shuffle的框架... 269
7.2.1 Shuffle的框架演進... 269
7.2.2 Shuffle的框架內(nèi)核... 270
7.2.3 Shuffle框架的源碼解析... 272
7.2.4 Shuffle數(shù)據(jù)讀寫的源碼解析... 275
7.3 Hash Based Shuffle. 281
7.3.1 概述... 281
7.3.2 Hash Based Shuffle內(nèi)核... 282
7.3.3 Hash Based Shuffle數(shù)據(jù)讀寫的源碼解析... 285
7.4 Sorted Based Shuffle. 290
7.4.1 概述... 292
7.4.2 Sorted Based
Shuffle內(nèi)核... 293
7.4.3 Sorted Based
Shuffle數(shù)據(jù)讀寫的源碼解析... 294
7.5 Tungsten Sorted Based Shuffle. 302
7.5.1 概述... 302
7.5.2 Tungsten Sorted
Based Shuffle內(nèi)核... 302
7.5.3 Tungsten Sorted
Based Shuffle數(shù)據(jù)讀寫的源碼解析... 303
7.6 Shuffle與Storage 模塊間的交互... 309
7.6.1 Shuffle注冊的交互... 310
7.6.2 Shuffle寫數(shù)據(jù)的交互... 314
7.6.3 Shuffle讀數(shù)據(jù)的交互... 315
7.6.4 BlockManager架構(gòu)原理、運行流程圖和源碼解密... 315
7.6.5 BlockManager解密進階:BlockManager初始化和注冊解密、BlockManager- Master工作解密、BlockTransferService解密、本地數(shù)據(jù)讀寫解密、遠程數(shù)據(jù)讀寫解密... 324
7.7 本章總結(jié)... 341
第8章 Job工作原理和源碼詳解... 342
8.1 Job到底在什么時候產(chǎn)生... 342
8.1.1 觸發(fā)Job的原理和源碼解析... 342
8.1.2 觸發(fā)Job的算子案例... 344
8.2 Stage劃分內(nèi)幕... 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處理結(jié)果是如何被Driver管理的... 364
8.4.1 ShuffleMapTask執(zhí)行結(jié)果和Driver的交互原理及源碼詳解... 364
8.4.2 ResultTask執(zhí)行結(jié)果與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與大數(shù)據(jù)其他經(jīng)典組件整合原理與實戰(zhàn)... 399
11.1
Spark組件綜合應(yīng)用... 399
11.2 Spark與Alluxio整合原理與實戰(zhàn)... 400
11.2.1 Spark與Alluxio整合原理... 400
11.2.2 Spark與Alluxio整合實戰(zhàn)... 401
11.3 Spark與Job Server整合原理與實戰(zhàn)... 403
11.3.1 Spark與Job
Server整合原理... 403
11.3.2 Spark與Job
Server整合實戰(zhàn)... 404
11.4 Spark與Redis整合原理與實戰(zhàn)... 406
11.4.1 Spark與Redis整合原理... 406
11.4.2 Spark與Redis整合實戰(zhàn)... 407
中篇 商業(yè)案例
第12章 Spark商業(yè)案例之大數(shù)據(jù)電影點評系統(tǒng)應(yīng)用案例... 412
12.1 通過RDD實現(xiàn)分析電影的用戶行為信息... 412
12.1.1 搭建IDEA開發(fā)環(huán)境... 412
12.1.2 大數(shù)據(jù)電影點評系統(tǒng)中電影數(shù)據(jù)說明... 425
12.1.3 電影點評系統(tǒng)用戶行為分析統(tǒng)計實戰(zhàn)... 428
12.2 通過RDD實現(xiàn)電影流行度分析... 431
12.3 通過RDD分析各種類型的最喜愛電影TopN及性能優(yōu)化技巧... 433
12.4 通過RDD分析電影點評系統(tǒng)仿QQ和微信等用戶群分析及廣播
背后機制解密... 436
12.5 通過RDD分析電影點評系統(tǒng)實現(xiàn)Java和Scala版本的二次排序系統(tǒng)... 439
12.5.1 二次排序自定義Key值類實現(xiàn)(Java)... 440
12.5.2 電影點評系統(tǒng)二次排序功能實現(xiàn)(Java)... 442
12.5.3 二次排序自定義Key值類實現(xiàn)(Scala)... 445
12.5.4 電影點評系統(tǒng)二次排序功能實現(xiàn)(Scala)... 446
12.6 通過Spark SQL中的SQL語句實現(xiàn)電影點評系統(tǒng)用戶行為分析... 447
12.7 通過Spark SQL下的兩種不同方式實現(xiàn)口碑最佳電影分析... 451
12.8 通過Spark SQL下的兩種不同方式實現(xiàn)最流行電影分析... 456
12.9 通過DataFrame分析最受男性和女性喜愛電影TopN.. 457
12.10 純粹通過DataFrame分析電影點評系統(tǒng)仿QQ和微信、淘寶等用戶群... 460
12.11 純粹通過DataSet對電影點評系統(tǒng)進行流行度和不同年齡階段興趣分析等... 462
12.11.1 通過DataSet實現(xiàn)某特定電影觀看者中男性和女性不同年齡的人數(shù)... 463
12.11.2 通過DataSet方式計算所有電影中平均得分最高
(口碑最好)的電影TopN.. 464
12.11.3 通過DataSet方式計算所有電影中粉絲或者觀看人數(shù)最多(最流行電影)的電影TopN 465
12.11.4 純粹通過DataSet的方式實現(xiàn)所有電影中最受男性、女性喜愛的
電影Top10. 466
12.11.5 純粹通過DataSet的方式實現(xiàn)所有電影中QQ或者微信核心目標
用戶最喜愛電影TopN分析... 467
12.11.6 純粹通過DataSet的方式實現(xiàn)所有電影中淘寶核心目標用戶最喜愛電影TopN分析 469
12.12 大數(shù)據(jù)電影點評系統(tǒng)應(yīng)用案例涉及的核心知識點原理、源碼及案例代碼... 470
12.12.1 知識點:廣播變量Broadcast內(nèi)幕機制... 470
12.12.2 知識點:SQL全局臨時視圖及臨時視圖... 473
12.12.3 大數(shù)據(jù)電影點評系統(tǒng)應(yīng)用案例完整代碼... 474
12.13 本章總結(jié)... 496