Spark 大數據分析 — 源碼解析與實例詳解

劉景澤

買這商品的人也買了...

商品描述

講解了網絡大數據時代應運而生的、能高效迅捷地分析處理數據的工具——Spark,它帶領讀者快速掌握用 Spark 收集、計算、簡化和保存海量數據的方法,學會交互、迭代和增量式分析,解決分區、數據本地化和自定義序列化等問題。

作者簡介

作者簡介: 
    全棧工程師,長期涉足大數據的研發工作。擁有豐富的大數據經驗,曾擔任多家知名企的主力研發,同時負責大數據云服務組件開發。精通Java、Scala、Python等多種編程語言,擅長大數據生態圈的研發、算法、逆向工程等技術。為多家企業提供技術支持,並長期面向企業一線開發人員分享實戰經驗。

目錄大綱

第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