Spark大數據分析——源碼解析與實例詳解
內容描述
講解了網絡大數據時代應運而生的、能高效迅捷地分析處理數據的工具——Spark,它帶領讀者快速掌握用 Spark 收集、計算、簡化和保存海量數據的方法,學會交互、迭代和增量式分析,解決分區、數據本地化和自定義序列化等問題。
目錄大綱
第1篇準備
第1章認識大數據和Spark 2
1.1大數據的介紹2
1.2 Apache Spark能做什麼3
1.3其他分佈式數據處理框架4
1.4如何使用本書4
∣1.4.1需要提前具備的基礎4
∣1.4.2準備相關開發環境4
∣1.4.3如何學習本書5
第2章安裝與配置Spark集群6
2.1下載Spark安裝包6
2.2檢查與準備集群環境7
2.3了解目前集群中已經部署的框架服務11
2.4部署Spark集群12
∣2.4.1實例1:基於Standalone模式部署Spark集群12
∣2.4.2實例2:部署Spark的歷史服務——Spark History Server 16
∣2.4.3實例3:基於Standalone模式部署高可用的Master服務18
∣2.4.4實例4:基於YARN模式部署Spark集群20
∣2.4.5 Standalone模式與YARN模式的特點22
2.5本章小結23
第3章第1個Spark程序24
3.1運行第1個Spark程序24
∣3.1.1實例5:基於Standalone模式運行第1個Spark程序24
∣3.1.2實例6:基於YARN模式運行第1個Spark程序27
∣3.1.3提交Spark程序時的參數規範30
3.2使用spark-shell編寫並運行WordCount程序30
∣3.2.1實例7:啟動spark-shell 31
∣3.2.2實例8:在spark-shell中編寫WordCount程序32
3.3使用IDEA編寫並運行WordCount程序34
∣3.3.1實例9:準備開發環境,並構建代碼工程34
∣3.3.2實例10:使用IDEA編寫WordCount程序41
∣3.3.3實例11:在IDEA中本地運行WordCount程序44
∣3.3.4實例12:在IDEA中遠程運行WordCount程序46
∣3.3.5實例13:打包程序,並提交至集群運行48
3.4本章小結49
第2篇入門
第4章讀寫分佈式數據——基於Spark Core 52
4.1 RDD的誕生52
4.2進一步理解RDD 53
∣4.2.1數據存儲53
∣4.2.2數據分析55
∣4.2.3程序調度56
4.3讀取數據並生成RDD 57
∣4.3.1實例14:讀取普通文本數據58
∣4.3. 2實例15:讀取JSON格式的數據59
∣4.3.3實例16:讀取CSV、TSV格式的數據61
∣4.3.4實例17:讀取SequenceFile格式的數據62
∣4.3.5實例18:讀取Object格式的數據64
∣4.3.6實例19:讀取HDFS中的數據——顯式調用Hadoop API 66
∣4.3.7實例20:讀取MySQL數據庫中的數據68
4.4保存RDD中的數據到外部存儲70
∣4.4.1實例21:保存成普通文本文件70
∣4.4.2實例22:保存成JSON文件71
∣4.4.3實例23:保存成CSV、TSV文件73
∣4.4.4實例24:保存成SequenceFile文件74
∣4.4.5實例25:保存成Object文件75
∣4.4.6實例26:保存成HDFS文件——顯式調用Hadoop API的方式76
∣4.4.7實例27:寫入MySQL數據庫78
4.5本章小結80
第5章處理分佈式數據——基於Spark Core 81
5.1 RDD的轉換(transformations)操作——轉換數據形態81
∣5.1.1實例28:基礎轉換操作81
∣5.1.2實例29:鍵值對轉換操作103
5.2 RDD的行動(actions)操作——觸發執行任務計劃115
∣5.2.1實例30:基礎行動操作116
∣5.2.2實例31:鍵值對行動操作125
∣5.2.3實例32:數值行動操作127
5.3本章小結128
第3篇進階
第6章RDD的高級操作130
6.1緩存RDD 130
∣6.1.1緩存RDD的基礎知識130
∣6.1.2實例33:緩存與釋放RDD 133
6.2 RDD的檢查點(Checkpoint)機制139
∣6.2.1了解Checkpoint機制139
∣6.2.2實例34:使用Checkpoint機制141
∣6.2.3 Checkpoint機制的工作流程144
6.3 RDD的依賴關係145
∣6.3.1窄依賴(narrow dependencies) 145
∣6.3.2寬依賴(wide/shuffle dependencies) 148
∣6.3.3實例35:讓子RDD混合依賴依賴多個父RDD 151
∣6.3.4實例36:詞頻統計——總結運算過程涉及的概念153
6.4累加器(Accumulator) 155
∣6.4.1認識累加器155
∣6.4.2實例37:使用系統累加器1——長整數、雙精度浮點數累加器156
∣ 6.4.3實例38:使用系統累加器2——集合累加器159
∣6.4.4實例39:自定義累加器160
6.5廣播(Broadcast)——將數據塊緩存到所有節點164
∣6.5.1認識廣播165
∣6.5.2實例40:使用廣播補全數據165
6.6本章小結168
第7章用SQL語法分析結構化數據——基於Spark SQL 169
7.1為什麼會產生Spark SQL 169
7.2認識DataFrame與Dataset數據類型170
∣7.2.1認識DataFrame 170
∣7.2.2認識Dataset 171
7.3實例41:通過Dataset、DataFrame分析用戶數據172
∣7.3.1用spark-shell編寫程序172
∣7.3.2用IDEA編寫程序175
7.4不同Spark版本的操作差異177
∣7.4.1認識SQLContext與HiveContext 178
∣ 7.4.2認識SparkSession 178
7.5 DataFrame、Dataset的基本操作179
∣7.5.1 DSL與SQL的語法風格179
∣7.5.2使用臨時視圖的注意事項181
∣7.5.3實例42:讀取JSON、CSV格式的數據183
∣7.5.4實例43:讀取Parquet格式的數據185
∣7.5.5實例44:讀取代碼中動態生成的數據185
∣7.5.6實例45:讀取關係型數據庫中的數據188
∣7.5 .7實例46:輸出Dataset、DataFrame中的數據189
∣7.5.8實例47:RDD、DataFrame、Dataset之間的相互轉換192
7.6用戶自定義函數195
∣7.6.1實例48:實現“一進一出”的UDF 195
∣7.6.2實例49:實現“多進一出”的UDAF 198
∣7.6.3實例50:實現“一進多出”的UDTF 208
7.7集成Spark SQL與Hive 211
∣7.7.1已經部署Hive框架211
∣7.7.2尚未部署Hive框架215
7.8本章小結215
第8章實時處理流式數據——基於Spark Streaming 216
8.1為什麼會產生Spark Streaming 216
8.2第1個Spark Streaming程序216
∣8.2.1實例51:用spark-shell編寫程序216
∣8.2.2實例52:用IDEA編寫程序221
8.3什麼是DStream 222
∣8.3.1認識DStream 222
∣8.3.2認識DStreamGraph 223
8.4讀取數據到DStream中227
∣8.4.1實例53:讀取HDFS文件夾中的數據227
∣8.4.2實例54:讀取RDD組成的數據隊列229
∣8.4.3實例55:實時讀取Flume中的數據230
∣8.4.4實例56:用高階API實時讀取Kafka中的數據235
∣8.4.5實例57 :用低階API實時讀取Kafka中的數據242
8.5 Spark Streaming中的幾個時間概念251
∣8.5.1批處理間隔251
∣8.5.2窗口時間寬度與滑動時間寬度252
∣8.5.3實例58:使用窗口操作,每兩秒鐘統計10秒內的平均溫度254
8.6 DStream的操作總結259
∣8.6.1 DStream的操作說明259
∣8.6.2實例59:直接面向DStream中的RDD進行數據分析261
∣8.6.3實例60:將DStream中的數據實時輸出至外部存儲系統263
∣8.6.4實例61:對Dstream進行join操作267
8.7 DStream中的轉換分類269
∣8.7.1無狀態轉換269
∣8.7.2有狀態轉換270
∣8.7.3實例:用有狀態轉換做全局詞頻統計270
8.8在Spark Streaming中的緩存與Checkpoint 272
∣8.8.1認識Spark Streaming中的Checkpoint 273
∣8.8.2實例62:使用Spark Streaming中的Checkpoint 273
8.9 Spark Streaming中的累加器與廣播變量276
∣8.9.1認識累加器與廣播變量276
∣8.9.2實例63:自定義累加器,並結合無狀態轉換,實現實時的全局詞頻統計276
8.10關閉Spark Streaming程序280
∣8.10.1關閉程序的方案281
∣8.10.2實例64:合理關閉一個運行中的Spark Streaming程序281
8.11本章小結284
第4篇高階
第9章實時處理流式數據——基於Structured Streaming 286
9.1為什麼會產生Structured Streaming 286
9.2第1個Structured Streaming程序287
∣9.2. 1實例65:用spark-shell編寫程序287
∣9.2.2實例66:用IDEA編寫程序289
9.3 Structured Streaming的編程模型291
9.4輸入數據——生成Streaming Dataset、 Streaming DataFrame 292
∣9.4.1實例67:根據文件生成工作流292
∣9.4.2實例68:根據文件、文件夾生成自動分區的工作流295
∣9.4.3實例69:根據Kafka以Streaming模式生成工作流297
∣9.4.4實例70:以Kafka為數據源,通過Batch方式生成工作流300
∣9.4.5實例71:根據指定速率生成工作流304
9.5基於事件時間的窗口操作305
∣9.5.1事件時間窗口的工作方式305
∣9.5.2實例72:事件時間窗口的生成規則307
∣9.5.3實例73:基於事件時間窗口實現詞頻統計311
9.6基於Watermark處理延遲數據314
∣9.6.1 Watermark的作用314
∣9.6. 2實例74:基於Update模式實現詞頻統計,並結合Watermark處理延遲數據314
∣9.6.3實例75:基於Append模式實現詞頻統計,並結合Watermark處理延遲數據320
∣9.6.4 Watermark的底層工作原理322
∣ 9.6.5總結:Watermark機制與輸出模式329
9.7實例76:在處理流式數據時去除重複數據330
9.8 Structured Streaming中的join操作332
∣9.8.1實例77:在Stream-Static模式下的inner join操作333
∣9.8.2實例78:在Stream-Stream模式下的inner join操作335
∣9.8.3總結:已經支持的join操作340
9.9在Structured Streaming中實現數據分組,並手動維護分組狀態341
∣9.9.1實例79:通過mapGroupsWithState實現數據分組,並手動維護分組狀態341
∣9.9.2實例80:通過flatMapGroupsWithState實現數據分組,並手動維護分組狀態347
∣9.9.3總結:手動維護狀態與Watermark的使用技巧352
9.10輸出分析結果353
∣9.10.1輸出模式(Output Mode)的使用場景353
∣9.10.2實例81:基於File Sink輸出數據354
∣9.10.3實例82:基於Kafka Sink,以Streaming方式輸出數據356
∣9.10.4實例83:基於Kafka Sink,以Batch方式輸出數據358
∣9.10.5實例84:基於Console Sink輸出數據360
∣9.10. 6實例85:基於Memory Sink輸出數據360
∣9.10.7實例86:基於Foreach Sink輸出數據362
∣9.10.8實例87:基於ForeachBatch Sink輸出數據367
∣9.10.9總結:不同Sink所適用的輸出模式369
9.11 Trigger觸發器的分類370
9.12管理與監控工作流370
∣9.12.1管理工作流370
∣9.12.2監控工作流372
9.13 Structured Streaming中的Checkpoint機制372
9.14連續處理模式——Continuous Processing 373
9.15本章小結374
第10章Spark的相關優化375
10.1優化Spark程序375
∣10.1.1實例88:盡可能減少或避免出現Shuffle過程375
∣10.1.2實例89:使用Kryo作為序列化方案377
∣10.1.3盡可能批量操作數據381
∣10.1.4合理設置分區數381
∣10.1.5合理設置批處理間隔381
10.2優化數據382
∣10.2.1關於數據傾斜382
∣10.2.2實例90:使用自定義Partitioner緩解數據傾斜383
∣10.2.3關於數據補全387
10.3調優資源388
10.4本章小結390
第5篇商業項目實戰
第11章實戰:學生學習情況分析系統392
11.1項目概述392
∣11.1.1業務背景392
∣11.1.2劃分業務模塊392
11.2開發環境說明393
11.3項目實現394
∣11.3.1構建工程394
∣11.3.2模擬數據395
∣11.3.3實時發送數據到Kafka 399
∣11.3.4實時分析平台答題數據402
∣11.3.5構建推薦模型405
∣11.3.6實時推薦題目411
∣11.3.7離線學情分析415
11.4本章小結422
作者介紹
作者簡介:
全棧工程師,長期涉足大數據的研發工作。擁有豐富的大數據經驗,曾擔任多家知名企的主力研發,同時負責大數據云服務組件開發。精通Java、Scala、Python等多種編程語言,擅長大數據生態圈的研發、算法、逆向工程等技術。為多家企業提供技術支持,並長期面向企業一線開發人員分享實戰經驗。