本書是一本講解Spark基礎(chǔ)應(yīng)用及編程的實用教程,基于 Spark 2.3 版本,內(nèi)容包括 Spark 與大數(shù)據(jù)、構(gòu)建 Spark 運行環(huán)境、開發(fā)一個Spark 程序、深入理解 Spark 程序代碼、RDD 編程、Spark SQL 結(jié)構(gòu)化數(shù)據(jù)處理、Spark Streaming、Structured Streaming、SparkR和GraphX。本書總結(jié)了Spark 學(xué)習(xí)的關(guān)鍵點;提出了 Spark 快速學(xué)習(xí)路線圖;提供配套的 Spark前置課程學(xué)習(xí)資源鏈接,包括虛擬機、Linux 和 Shell 免費高清視頻、《零基礎(chǔ)快速入門Scala》免費電子書等,幫助零基礎(chǔ)讀者迅速夯實Spark基礎(chǔ)。
本書配以大量的示例、源代碼和注釋,可以幫助讀者快速、全面而又深入地掌握Spark編程技能。
本書既可作為高等院校大數(shù)據(jù)、云計算和人工智能相關(guān)專業(yè)的教材,也可以作為Spark學(xué)習(xí)者和大數(shù)據(jù)研發(fā)人員的技術(shù)參考書。
目 錄
前言
第1章 Spark與大數(shù)據(jù)1
1.1 大數(shù)據(jù)開發(fā)基礎(chǔ)1
1.1.1 什么是大數(shù)據(jù)1
1.1.2 大數(shù)據(jù)開發(fā)的通用步驟2
1.1.3 大數(shù)據(jù)開發(fā)技術(shù)4
1.2 初識Spark10
1.2.1 Spark是什么10
1.2.2 Spark的技術(shù)特點11
1.3 Spark技術(shù)棧12
1.4 Spark重要組件13
1.4.1 Spark Core13
1.4.2 Spark SQL14
1.4.3 GraphX15
1.4.4 流數(shù)據(jù)處理16
1.4.5 SparkR17
1.4.6 MLlib/ML18
1.4.7 Spark交互工具18
1.5 Spark和Scala19
1.5.1 Scala語言簡介19
1.5.2 為什么用Scala開發(fā)Spark框架20
1.5.3 為什么用Scala開發(fā)Spark程序20
1.5.4 Scala開發(fā)Spark程序所涉及的
技術(shù)20
1.5.5 Scala語言基礎(chǔ)21
1.6 如何快速掌握Spark21
1.6.1 Spark學(xué)習(xí)的痛點21
1.6.2 Spark快速學(xué)習(xí)路線圖22
1.6.3 Spark學(xué)習(xí)中的關(guān)鍵點23
1.6.4 利用本書相關(guān)資源高效學(xué)習(xí)Spark23
1.6.5 本書所使用的軟件和版本25
1.7 練習(xí)25
第2章 構(gòu)建Spark運行環(huán)境26
2.1 Spark程序運行時架構(gòu)26
2.2 構(gòu)建Spark大數(shù)據(jù)運行環(huán)境28
2.2.1 構(gòu)建HDFS28
2.2.2 構(gòu)建Yarn30
2.2.3 構(gòu)建Spark集群31
2.3 運行Spark程序(Local方式)31
2.4 運行Spark程序(分布式方式)32
2.4.1 Spark on Yarn32
2.4.2 Spark on Standalone36
2.5 Spark程序在spark-shell上運行41
2.6 使用Web UI監(jiān)控Spark程序
運行43
2.7 擴展集群節(jié)點48
2.8 練習(xí)49
第3章 開發(fā)一個Spark程序51
3.1 在命令行模式下開發(fā)Spark程序51
3.1.1 構(gòu)建Scala程序編譯環(huán)境51
3.1.2 使用Vim編寫Spark程序53
3.1.3 使用命令編譯、打包Spark程序54
3.1.4 運行Spark程序56
3.1.5 使用java命令運行Spark程序57
3.1.6 Spark程序編譯、運行、部署的
關(guān)鍵點58
3.2 使用IDEA開發(fā)Spark程序58
3.2.1 IDEA安裝和基本使用59
3.2.2 使用IDEA編輯Spark代碼60
3.2.3 IDEA編譯、打包62
3.2.4 IDEA遠程提交Spark程序63
3.3 練習(xí)64
第4章 深入理解Spark程序代碼66
4.1 Spark程序代碼結(jié)構(gòu)66
4.2 Spark程序代碼的核心概念68
4.2.1 RDD68
4.2.2 Application68
4.2.3 Job69
4.2.4 DAG70
4.2.5 Stage72
4.2.6 Task76
4.2.7 Application、Job、Stage和Task的
并行粒度和并行條件77
4.3 Spark程序代碼執(zhí)行過程77
4.4 練習(xí)85
第5章 RDD編程86
5.1 RDD核心概念86
5.1.1 Transformation的基本概念87
5.1.2 Action的基本概念88
5.1.3 Partition的基本概念88
5.2 創(chuàng)建RDD89
5.2.1 使用parallelize/makeRDD
創(chuàng)建RDD89
5.2.2 使用textFile創(chuàng)建RDD91
5.2.3 其他RDD創(chuàng)建操作92
5.3 RDD Partition93
5.3.1 Partition的基本操作94
5.3.2 Partition的分區(qū)過程96
5.3.3 Partition和Task98
5.3.4 計算Partition的個數(shù)100
5.3.5 Partition的綜合應(yīng)用103
5.4 Transformation操作107
5.4.1 map操作107
5.4.2 flatMap操作111
5.4.3 mapPartitions操作113
5.4.4 join操作115
5.4.5 union操作120
5.4.6 intersection操作121
5.4.7 groupBy操作123
5.4.8 groupByKey操作124
5.4.9 reduceByKey操作125
5.4.10 aggregateByKey操作127
5.4.11 cogroup操作129
5.5 Action操作130
5.5.1 collect操作130
5.5.2 reduce操作130
5.5.3 fold操作131
5.5.4 aggregate操作133
5.5.5 foreachPartition操作134
5.5.6 saveAsTextFile操作135
5.5.7 saveAsObjectFile操作135
5.6 RDD的cache/persist和
checkpoint操作136
5.6.1 cache/persist和checkpoint概述136
5.6.2 cache/persist使用注意事項137
5.6.3 cache/persist操作138
5.6.4 checkpoint操作139
5.7 練習(xí)140
第6章 Spark SQL結(jié)構(gòu)化數(shù)據(jù)處理142
6.1 Spark SQL的核心概念142
6.1.1 結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù)142
6.1.2 DataFrame143
6.1.3 Dataset144
6.1.4 Persistent Table和Data
Warehouse145
6.1.5 SQL146
6.1.6 SparkSession147
6.2 Spark SQL數(shù)據(jù)處理概述147
6.2.1 Spark SQL數(shù)據(jù)處理環(huán)境147
6.2.2 Spark SQL處理結(jié)構(gòu)化數(shù)據(jù)149
6.2.3 Spark SQL處理不同數(shù)據(jù)源的
數(shù)據(jù)150
6.3 構(gòu)建Spark SQL運行環(huán)境150
6.3.1 Spark SQL運行環(huán)境概述150
6.3.2 構(gòu)建最簡的Spark SQL運行環(huán)境151
6.3.3 構(gòu)建兼容Hive的Spark SQL運行
環(huán)境153
6.4 DataFrame/Dataset快速上手157
6.4.1 DataFrame/Dataset使用概述157
6.4.2 在spark-shell中使用DataFrame/
Dataset157
6.4.3 在代碼中使用DataFrame/Dataset161
6.4.4 DataFrame/Dataset使用上的區(qū)別163
6.4.5 DataFrame行解析方法164
6.4.6 DataFrame和Dataset轉(zhuǎn)換164
6.5 DataFrame/Dataset與數(shù)據(jù)源的
轉(zhuǎn)換165
6.5.1 DataFrame/Dataset與數(shù)據(jù)源的轉(zhuǎn)換
關(guān)系和方法概述165
6.5.2 DataFrame/Dataset與Seq的轉(zhuǎn)換167
6.5.3 DataFrame/Dataset與RDD的
轉(zhuǎn)換169
6.5.4 DataFrame/Dataset文件與Sequence
文件的轉(zhuǎn)換170
6.5.5 DataFrame/Dataset與CSV文件的
轉(zhuǎn)換170
6.5.6 DataFrame/Dataset與JSON文件的
轉(zhuǎn)換176
6.5.7 DataFrame/Dataset與ORC文件的
轉(zhuǎn)換178
6.5.8 DataFrame/Dataset與Parquet文件
的轉(zhuǎn)換179
6.5.9 DataFrame/Dataset與Avro文件的
轉(zhuǎn)換182
6.5.10 DataFrame/Dataset與MySQL
數(shù)據(jù)庫的轉(zhuǎn)換183
6.5.11 DataFrame/Dataset與Hive表的
轉(zhuǎn)換188
6.5.12 DataFrame/Dataset與Built-in data
source表的轉(zhuǎn)換193
6.6 DataFrame/Dataset常用API198
6.6.1 Action198
6.6.2 Basic Dataset function200
6.6.3 Typed Transformation205
6.6.4 Untyped Transformation213
6.7 SQL操作223
6.7.1 常用DDL使用說明及示例224
6.7.2 DQL使用說明及示例226
6.7.3 常用DML使用說明及示例232
6.8 練習(xí)234
第7章 Spark Streaming236
7.1 Spark Streaming基礎(chǔ)236
7.1.1 流數(shù)據(jù)定義及其特點236
7.1.2 Spark Streaming的工作流程237
7.1.3 Spark Streaming的核心概念238
7.2 編寫一個Spark Streaming程序241
7.3 Spark Streaming Web UI的使用244
7.3.1 Spark Streaming Web UI使用前
準備244
7.3.2 Spark Streaming Web UI參數(shù)
說明247
7.4 多路流數(shù)據(jù)合并處理示例250
7.4.1 示例實現(xiàn)說明250
7.4.2 示例分析:多數(shù)據(jù)流中Batch Job
的執(zhí)行254
7.5 DStream Transformation操作255
7.5.1 DStream Transformation實現(xiàn)
原理256
7.5.2 DStream常見的Transformation
操作及說明258
7.5.3 Spark Streaming的窗口(Window)
操作及示例259
7.6 DStream Output 操作262
7.7 練習(xí)264
第8章 Structured Streaming265
8.1 Structured Streaming基礎(chǔ)265
8.1.1 Structured Streaming處理流程265
8.1.2 Structured Streaming基本概念266
8.1.3 Structured Streaming技術(shù)特性268
8.2 Structured Streaming接入Text File
數(shù)據(jù)源268
8.3 Structured Streaming接入Rate
數(shù)據(jù)源273
8.4 使用Schema解析JSON格式
數(shù)據(jù)源274
8.5 使用DataFrame/Dataset處理
流數(shù)據(jù)277
8.6 Structured Streaming Window
操作282
8.7 Structured Streaming Watermarking
操作288
8.8 Structured Streaming JOIN操作290
8.8.1 Streaming數(shù)據(jù)與Static數(shù)據(jù)的
JOIN操作示例291
8.8.2 Streaming數(shù)據(jù)與Streaming數(shù)據(jù)
的JOIN操作示例295
8.9 練習(xí)304
第9章 SparkR305
9.1 SparkR基礎(chǔ)305
9.1.1 為什么需要SparkR305
9.1.2 什么是SparkR306
9.1.3 SparkR和R的關(guān)系306
9.1.4 SparkR的技術(shù)特征306
9.1.5 SparkR程序運行時架構(gòu)306
9.2 構(gòu)建SparkR程序開發(fā)和運行
環(huán)境307
9.3 SparkR代碼的執(zhí)行方式308
9.3.1 在RStudio-server上執(zhí)行SparkR
代碼309
9.3.2 在R Shell上執(zhí)行SparkR代碼311
9.3.3 使用spark-submit執(zhí)行SparkR
代碼312
9.3.4 在sparkR上執(zhí)行SparkR代碼313
9.4 SparkR的基本使用314
9.4.1 SparkR編程的基本流程315
9.4.2 創(chuàng)建SparkDataFrame315
9.4.3 SparkDataFrame的基本操作318
9.4.4 在Spark上分布式執(zhí)行R函數(shù)319
9.4.5 SQL查詢323
9.5 SparkR機器學(xué)習(xí)算子323
9.5.1 SparkR常用的機器學(xué)習(xí)算子323
9.5.2 SparkR機器學(xué)習(xí)算子的使用324
9.6 利用SparkR實現(xiàn)單詞統(tǒng)計和
圖形輸出326
9.7 練習(xí)329
第10章 GraphX330
10.1 GraphX基礎(chǔ)330
10.1.1 圖的定義和傳統(tǒng)表示方法330
10.1.2 圖計算332
10.1.3 有向多重圖332
10.1.4 GraphX特性333
10.1.5 GraphX框架334
10.2 GraphX的基本數(shù)據(jù)結(jié)構(gòu)335
10.2.1 VertexRDD335
10.2.2 EdgeRDD338
10.2.3 Graph340
10.3 GraphX實現(xiàn)最短路徑算法——
SGDSP354
10.4 GraphX Pregel的原理及使用361
10.4.1 GraphX Pregel接口說明361
10.4.2 GraphX Pregel的處理流程362
10.4.3 GraphX Pregel的使用363
10.5 GraphX Pregel實現(xiàn)最短路徑
算法——SGPSP366
10.6 練習(xí)370
參考文獻372