萬字長文+圖解,帶你輕鬆學習 Spark(文末送PDF)
1、初識 Spark
Spark不僅能夠在記憶體中進行高效運算,還是一個大一統的軟體棧,可以適用於各種各樣原本需要多種不同的分散式平臺的場景。
1)背景
Spark作為一個用來快速實現大規模資料計算的通用分散式大資料計算引擎,是大資料開發工程師必備的一項技術棧。Spark相對Hadoop具有較大優勢,但Spark並不能完全替代Hadoop。
實際上,Spark已經很好地融入了Hadoop家族,作為其中一員,主要用於替代Hadoop中的MapReduce計算模型。
2)Spark 的優勢
Spark擁有Hadoop MapReduce所具備的優點,但不同的是,Hadoop每次經過job執行的中間結果都會儲存在HDFS上,而Spark執行job的中間過程資料可以直接儲存在記憶體中,無需讀寫到HDFS磁碟上。因為記憶體的讀寫速度與磁碟的讀寫速度不在一個數量級上,所以Spark利用記憶體中的資料可以更快地完成資料的計算處理。
此外,由於Spark在內部使用了彈性分散式資料集(Resilient Distributed Dataset,RDD),經過了資料模型的最佳化,即便在磁碟上進行分散式計算,其計算效能也是高於Hadoop MapReduce的。
3)Spark的特點
計算速度快
Spark將處理的每個任務都構造出一個有向無環圖(Directed Acyclic Graph,DAG)來執行,實現原理是基於RDD在記憶體中對資料進行迭代計算的,因此計算速度很快。官方資料表明,如果計算資料是從磁碟中讀取,Spark計算速度是Hadoop的10倍以上;如果計算資料是從記憶體中讀取,Spark計算速度則是Hadoop的100倍以上。
易於使用
Spark提供了80多個高階運算操作,支援豐富的運算元。開發人員只需呼叫Spark封裝好的API來實現即可,無需關注Spark的底層架構。
通用大資料框架
大資料處理的傳統方案需要維護多個平臺,比如,離線任務是放在Hadoop MapRedue上執行,實時流計算任務是放在Storm上執行。而Spark則提供了一站式整體解決方案,可以將即時查詢、離線計算、實時流計算等多種開發庫無縫組合使用。
支援多種資源管理器
Spark支援多種執行模式,比如Local、Standalone、YARN、Mesos、AWS等部署模式。使用者可以根據現有的大資料平臺靈活地選擇執行模式。
Spark生態圈豐富
Spark不僅支援多種資源管理器排程job,也支援HDFS、HBase等多種持久化層讀取資料,來完成基於不同元件實現的應用程式計算。目前,Spark生態圈已經從大資料計算和資料探勘擴充套件到機器學習、NLP、語音識別等領域。
2、Spark 的模組組成
Spark 是包含多個緊密整合的元件,這些元件結合密切並且可以相互呼叫,這樣我們可以像在平常軟體專案中使用程式庫一樣,組合使用這些的元件。
1)Spark 的模組組成
Spark 基於 Spark Core 建立了 Spark SQL、Spark Streaming、MLlib、GraphX、SparkR等核心元件;
基於這些不同元件又可以實現不同的計算任務;
這些計算任務的執行模式有:本地模式、獨立模式、YARN、Mesos等;
Spark任務的計算可以從HDFS、HBase、Cassandra等多種資料來源中存取資料。
3、Spark 的執行原理
Local 模式 :學習測試使用,分為 Local 單執行緒和 Local-Cluster 多執行緒兩種方式;
Standalone 模式 :學習測試使用,在 Spark 自己的資源排程管理框架上執行;
ON YARN :生產環境使用,在 YARN 資源管理器框架上執行,由 YARN 負責資源管理,Spark 負責任務排程和計算;
ON Mesos :生產環境使用,在 Mesos 資源管理器框架上執行,由 Mesos 負責資源管理,Spark 負責任務排程和計算;
On Cloud :執行在 AWS、阿里雲、華為雲等環境。
Cluster Manager :Spark 叢集管理器,主要用於整個叢集資源的管理和分配,有多種部署和執行模式;
Worker :Spark 的工作節點,用於執行提交的任務;
Executor :真正執行計算任務的一個程式,負責 Task 的執行並且將執行的結果資料儲存到記憶體或磁碟上;
Driver :Application 的驅動程式,可以理解為驅動程式執行中的 main() 函式,Driver 在執行過程中會建立 Spark Context;
Application :基於 Spark API 編寫的應用程式,包括實現 Driver 功能的程式碼和在叢集中多個節點上執行的 Executor 程式碼。
透過序號產生器制向 Cluster Manager彙報自身的 CPU 和記憶體等資源使用資訊;
在 Master 的指示下,建立並啟動 Executor(真正的計算單元);
將資源和任務進一步分配給 Executor 並執行;
同步資源資訊和 Executor 狀態資訊給 Cluster Manager。
執行 Application 的 main() 函式;
建立 SparkContext;
劃分 RDD 並生成 DAG;
構建 Job 並將每個 Job 都拆分為多個 Stage,每個 Stage 由多個 Task 構成,也被稱為 Task Set;
與 Spark 中的其他元件進行資源協調;
生成併傳送 Task 到 Executor。
4、RDD 概念及核心結構
Internally, each RDD is characterized by five main properties:
- A list of partitions
- A function for computing each split
- A list of dependencies on other RDDs
- Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
- Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)
一組分割槽(Partition)的列表,其中分割槽也就是RDD的基本組成單位;
一個函式會被作用到每個分割槽上,RDD 的計算是以分割槽為單位的;
一個 RDD 會依賴其他多個 RDD,它們之間具有依賴關係;
可選,對於K-V型的RDD會有一個分割槽函式,控制key分到哪個reduce;
可選,一個儲存每個分割槽優先位置的列表。
Stage:當 Spark 執行作業時,會根據 RDD 之間的依賴關係,按照寬窄依賴生成一個最優的執行計劃。如果 RDD 之間為窄依賴,則會被劃到一個 Stage 中;如果 RDD 之間為寬依賴,則會被劃分到不同的 Stage 中,這樣做的原因就是每個 Stage 內的 RDD 都儘可能在各個節點上並行地被執行,以提高執行效率。
優先列表(PreferredLocation):用於儲存每個分割槽優先位置的列表,對於每個 HDFS 檔案來說,就是儲存下每個分割槽所在 block 的位置。按照“移動資料不如移動計算”的理念,Spark 在執行任務排程時會優先選擇有儲存資料的 Worker 節點進行任務運算。
CheckPoint:是 Spark 提供的一種基於快照的快取機制,如果在任務運算中,多次使用同一個 RDD,可以將這個 RDD 進行快取處理。這樣,該 RDD 只有在第一次計算時會根據依賴關係得到分割槽資料,在後續使用到該 RDD 時,直接從快取處取而不是重新進行計算。
如下圖,對 RDD-1 做快照快取處理,那麼當RDD-n 在用到 RDD-1 資料時,無需重新計算 RDD-1,而是直接從快取處取數重算。此外,Spark 還提供了另一種快取機制 Cache,其中的資料是由 Executor 管理的,當 Executor 消失時,Cache 快取的資料也將會消失。而 CheckPoint 是將資料儲存到磁碟或者 HDFS 中的,當任務執行錯誤時,Job 會從CheckPoint 快取位置取數繼續計算。
5、Spark RDD 的寬窄依賴關係
寬依賴 :父 RDD 中每個分割槽的資料都可以被子 RDD 的多個分割槽使用(涉及到了shuffle);
窄依賴 :父 RDD 中每個分割槽的資料最多隻能被子 RDD 的一個分割槽使用。
說白了,就是看兩個 RDD 的分割槽之間,是不是一對一的關係,若是則為窄依賴,反之則為寬依賴。
寬依賴的運算元 :join(非hash-partitioned)、groupByKey、partitionBy;
窄依賴的運算元 :map、filter、union、join(hash-partitioned)、mapPartitions;
6、Spark RDD 的轉換操作與行動操作
val lines = sc.parallelize(Arrays.asList(1,2,3,4,5),n)
val lines = sc.textFile("../temp.txt")
val inputRDD = sc.textFile("log.txt")
val errorsRDD = inputRDD.filter(line => line.contains("error"))
val countRDD = errorsRDD.count()
如果分不清楚給定的一個 RDD 操作方法是屬於轉換操作還是行動操作,去看下它的返回型別,轉換操作返回的是 RDD 型別,而行動操作則返回的是其他的資料型別。
7、Spark RDD 中常用的操作運算元
val input = sc.parallelize(List(-2,-1,0,1,2))
val rdd1 = input.map(x => x * x)
val rdd2 = rdd1.filter(x => x != 0 )
val lines = sc.parallelize(List("hello spark","hi,flink"))
val rdd1 = lines.map(line => line.split(","))
val rdd2 = lines.flatMap(line => line.split(","))
8、Spark 的共享變數之累加器和廣播變數
var n = 1
val func = (i:Int) => i + n
var sum = 0
val arr = Array(1,2,3,4,5)
sc.parallelize(arr).foreach(x => sum + x)
println(sum)
val sc = new SparkContext(...)
val logs = sc.textFile(...)
val blanklines = sc.accumulator(0)
val callSigns = logs.flatMap(line => {
if(line == ""){
blanklines += 1
}
line.split("")
})
callSigns.count()
println("日誌中的空行數為:" + blanklines.value)
val broadcastVar = sc.broadcast(Array(1,2,3))
broadcastVar.value
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024420/viewspace-2929072/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 萬字長文,帶你輕鬆學習 SparkSpark
- 一篇文章圖文並茂地帶你輕鬆學完 JavaScript 閉包JavaScript
- 一篇文章圖文並茂地帶你輕鬆學會 HTML5 storageHTML
- 一篇文章圖文並茂地帶你輕鬆學完 JavaScript 設計模式(一)JavaScript設計模式
- 一文帶你入門圖機器學習機器學習
- 帶你輕鬆瞭解C# Lock 關鍵字C#
- 學習筆記:帶你十天輕鬆搞定 Go 微服務系列(一)筆記Go微服務
- 學習筆記:帶你十天輕鬆搞定 Go 微服務系列(二)筆記Go微服務
- 一篇文章圖文並茂地帶你輕鬆學完 JavaScript 事件迴圈機制(event loop)JavaScript事件OOP
- 一文看懂 ZooKeeper ,面試再也不用背八股(文末送PDF)面試
- 五萬字長文帶你學會SpringSpring
- 一文帶你學習SpringBootSpring Boot
- 一篇文章圖文並茂地帶你輕鬆實踐 HTML5 history apiHTMLAPI
- 一文讓你輕鬆掌握 HTTPSHTTP
- 如何輕鬆學習 Kubernetes?
- GitHub標星3W+,80個Python案例,帶你輕鬆玩轉Python學習!GithubPython
- 輕輕鬆鬆帶你入門Android Jetpack(含Jetpack Compose),容易肝不難!AndroidJetpack
- 怎麼輕鬆學習JavaScriptJavaScript
- 帶你輕鬆上手Mac快捷鍵使用小技巧!Mac
- PDF Expert:輕鬆填寫與建立PDF表單
- 【長文】帶你搞明白RedisRedis
- 萬字長文帶你徹底吃透Spring迴圈依賴,堪稱全網最全(文末福利)Spring
- 教你輕鬆整合華為Image Kit圖文排版功能
- 如何輕鬆學習Python資料分析?Python
- Yii2 - Active Record 輕鬆學習
- 帶你十天輕鬆搞定 Go 微服務系列(六)Go微服務
- 帶你十天輕鬆搞定 Go 微服務系列(七)Go微服務
- 帶你十天輕鬆搞定 Go 微服務系列(一)Go微服務
- 帶你十天輕鬆搞定 Go 微服務系列(二)Go微服務
- 帶你十天輕鬆搞定 Go 微服務系列(四)Go微服務
- 帶你十天輕鬆搞定 Go 微服務系列(五)Go微服務
- 帶你十天輕鬆搞定 Go 微服務系列(三)Go微服務
- 帶你輕鬆使用Hyperf玩轉Grpc(一)環境搭建RPC
- 一文帶你瞭解深度學習中的各種卷積(上)深度學習卷積
- 一文帶你瞭解深度學習中的各種卷積(下)深度學習卷積
- 一文帶你過完Spark RDD的基礎概念Spark
- 【備忘】《圖解Spark 核心技術與案例實戰》PDF圖解Spark
- AI 學習之路——輕鬆初探 Python 篇(三)AIPython