30分鐘理解Spark的基本原理

一,Spark優點特色web


做爲大數據計算框架MapReduce的繼任者,Spark具有如下優點特性。算法


1,高效性編程


不一樣於MapReduce將中間計算結果放入磁盤中,Spark採用內存存儲中間計算結果,減小了迭代運算的磁盤IO,並經過並行計算DAG圖的優化,減小了不一樣任務之間的依賴,下降了延遲等待時間。內存計算下,Spark 比 MapReduce 快100倍。微信


2,易用性數據結構


不一樣於MapReduce僅支持Map和Reduce兩種編程算子,Spark提供了超過80種不一樣的Transformation和Action算子,如map,reduce,filter,groupByKey,sortByKey,foreach等,而且採用函數式編程風格,實現相同的功能須要的代碼量極大縮小。架構


3,通用性app


Spark提供了統一的解決方案。Spark能夠用於批處理、交互式查詢(Spark SQL)、實時流處理(Spark Streaming)、機器學習(Spark MLlib)和圖計算(GraphX)。框架


這些不一樣類型的處理均可以在同一個應用中無縫使用。這對於企業應用來講,就可以使用一個平臺來進行不一樣的工程實現,減小了人力開發和平臺部署成本。機器學習


4,兼容性分佈式


Spark可以跟不少開源工程兼容使用。如Spark可使用Hadoop的YARN和Apache Mesos做爲它的資源管理和調度器,而且Spark能夠讀取多種數據源,如HDFS、HBase、MySQL等。





二,Spark基本概念


RDD:是彈性分佈式數據集(Resilient Distributed Dataset)的簡稱,是分佈式內存的一個抽象概念,提供了一種高度受限的共享內存模型。


DAG:是Directed Acyclic Graph(有向無環圖)的簡稱,反映RDD之間的依賴關係。


Driver Program:控制程序,負責爲Application構建DAG圖。


Cluster Manager:集羣資源管理中心,負責分配計算資源。


Worker Node:工做節點,負責完成具體計算。


Executor:是運行在工做節點(Worker Node)上的一個進程,負責運行Task,併爲應用程序存儲數據。


Application:用戶編寫的Spark應用程序,一個Application包含多個Job。


Job:做業,一個Job包含多個RDD及做用於相應RDD上的各類操做。


Stage:階段,是做業的基本調度單位,一個做業會分爲多組任務,每組任務被稱爲「階段」。


Task:任務,運行在Executor上的工做單元,是Executor中的一個線程。


總結:Application由多個Job組成,Job由多個Stage組成,Stage由多個Task組成。Stage是做業調度的基本單位。



三,Spark架構設計


Spark集羣由Driver, Cluster Manager(Standalone,Yarn 或 Mesos),以及Worker Node組成。對於每一個Spark應用程序,Worker Node上存在一個Executor進程,Executor進程中包括多個Task線程。



四,Spark運行流程


1,Application首先被Driver構建DAG圖並分解成Stage。


2,而後Driver向Cluster Manager申請資源。


3,Cluster Manager向某些Work Node發送徵召信號。


4,被徵召的Work Node啓動Executor進程響應徵召,並向Driver申請任務。


5,Driver分配Task給Work Node。


6,Executor以Stage爲單位執行Task,期間Driver進行監控。


7,Driver收到Executor任務完成的信號後向Cluster Manager發送註銷信號。


8,Cluster Manager向Work Node發送釋放資源信號。


9,Work Node對應Executor中止運行。




五,Spark部署模式


Local:本地運行模式,非分佈式。


Standalone:使用Spark自帶集羣管理器,部署後只能運行Spark任務。


Yarn:Haoop集羣管理器,部署後能夠同時運行MapReduce,Spark,Storm,Hbase等各類任務。


Mesos:與Yarn最大的不一樣是Mesos 的資源分配是二次的,Mesos負責分配一次,計算框架能夠選擇接受或者拒絕。



六,RDD數據結構


RDD全稱Resilient Distributed Dataset,彈性分佈式數據集,它是記錄的只讀分區集合,是Spark的基本數據結構。


RDD表明一個不可變、可分區、裏面的元素可並行計算的集合。


通常有兩種方式能夠建立RDD,第一種是讀取文件中的數據生成RDD,第二種則是經過將內存中的對象並行化獲得RDD。


//經過讀取文件生成RDD
val  rdd = sc.textFile("hdfs://hans/data_warehouse/test/data")


//經過將內存中的對象並行化獲得RDD
val num = Array(1,2,3,4,5)
val rdd = sc.parallelize(num)
//或者 val rdd = sc.makeRDD(num)


建立RDD以後,可使用各類操做對RDD進行編程。


RDD的操做有兩種類型,即Transformation操做和Action操做。轉換操做是從已經存在的RDD建立一個新的RDD,而行動操做是在RDD上進行計算後返回結果到 Driver。


Transformation操做都具備 Lazy 特性,即 Spark 不會馬上進行實際的計算,只會記錄執行的軌跡,只有觸發Action操做的時候,它纔會根據 DAG 圖真正執行。


操做肯定了RDD之間的依賴關係。


RDD之間的依賴關係有兩種類型,即窄依賴和寬依賴。窄依賴時,父RDD的分區和子RDD的分區的關係是一對一或者多對一的關係。而寬依賴時,父RDD的分區和子RDD的分區是一對多或者多對多的關係。


寬依賴關係相關的操做通常具備shuffle過程,即經過一個Patitioner函數將父RDD中每一個分區上key不一樣的記錄分發到不一樣的子RDD分區。


依賴關係肯定了DAG切分紅Stage的方式。


切割規則:從後往前,遇到寬依賴就切割Stage。


RDD之間的依賴關係造成一個DAG有向無環圖,DAG會提交給DAGScheduler,DAGScheduler會把DAG劃分紅相互依賴的多個stage,劃分stage的依據就是RDD之間的寬窄依賴。遇到寬依賴就劃分stage,每一個stage包含一個或多個task任務。而後將這些task以taskSet的形式提交給TaskScheduler運行。



七,WordCount範例


只須要四行代碼就能夠完成WordCount詞頻統計。


val file = sc.textFile("hello.txt")
val word = file.flatMap(_.split(","))
val wordOne = word.map((_,1))
wordOne.reduceByKey(_+_)



本文主要來自廈門大學林子雨老師的《Spark編程基礎》課程讀書筆記,點擊文末閱讀原文查看課程連接。

本文分享自微信公衆號 - Python與算法之美(Python_Ai_Road)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索