簡介
  Spark已經形成了一套(tao)完整(zheng)的(de)生(sheng)態體(ti)系,包括(kuo) Spark提(ti)供(gong)的(de)內存(cun)計算框架、SQL即席(xi)查(cha)詢(Spark SQL)、流式(shi)(shi)計算(Spark Streaming)、機器(qi)(qi)學習(MLlib)、圖計算(Graph X)等,Spark可以(yi)部(bu)署在yarn資源管理(li)器(qi)(qi)上,提(ti)供(gong)一站式(shi)(shi)大(da)數(shu)據(ju)解決方案,可以(yi)同時(shi)支(zhi)持批處理(li)、流處理(li)、交互式(shi)(shi)查(cha)詢。相比于老一代的(de)大(da)數(shu)據(ju)處理(li)工(gong)具MapReduce具備(bei)以(yi)下優勢:
- 
Spark提供更多種數據集操作類型,編程模型比MapReduce更加靈活; 
- 
Spark提供內存計算,將計算結果直接放在內存中,減少了迭代計算的IO開銷,有更高效的運算效率。 
- 
Spark基于DAG的任務調度執行機制,迭代效率更高;在實際開發中MapReduce需要編寫很多底層代碼,不夠高效,Spark提供了多種高層次、簡潔的API實現相同功能的應用程序,實現代碼量比MapReduce少很多。 
常見的Spark概念
- RDD:是Resilient Distributed Dataset(彈性分布式數據集)的簡稱,是分布式內存的一個抽象概念,提供了一種高度受限的共享內存模型 ;
- DAG:是Directed Acyclic Graph(有向無環圖)的簡稱,反映RDD之間的依賴關系 ;
- Executor:是運行在工作節點(WorkerNode)的一個進程,負責運行Task ;
- 應用(Application):用戶編寫的Spark應用程序;
- 任務( Task ):運行在Executor上的工作單元 ;
- 作業( Job ):一個作業包含多個RDD及作用于相應RDD上的各種操作;
- 階段( Stage ):是作業的基本調度單位,一個作業會分為多組任務,每組任務被稱為階段,或者也被稱為任務集合,代表了一組關聯的、相互之間沒有Shuffle依賴關系的任務組成的任務集;
以上(shang)概念(nian)之間的聯系如下:
Spark運(yun)行(xing)架構包括集群(qun)資(zi)源管理器(Cluster Manager)、運(yun)行(xing)作(zuo)業任務(wu)的(de)工(gong)作(zuo)節(jie)點(dian)(Worker Node)、每個(ge)應用的(de)任務(wu)控制節(jie)點(dian)(Driver)和每個(ge)工(gong)作(zuo)節(jie)點(dian)上負(fu)責具體任務(wu)的(de)執行(xing)進程(Executor),資(zi)源管理器可以自帶或使(shi)用Mesos/YARN。
一個(ge)(ge)應用由(you)一個(ge)(ge)Driver和若干個(ge)(ge)作業構成,一個(ge)(ge)作業由(you)多個(ge)(ge)階(jie)段(duan)構成,一個(ge)(ge)階(jie)段(duan)由(you)多個(ge)(ge)沒有Shuffle關系的任務(wu)組(zu)成;
當執行一個應用時,Driver會向(xiang)集群管理器(qi)申請資(zi)源,啟動Executor,并向(xiang)Executor發送應用程(cheng)序代碼和(he)文件,然(ran)后在(zai)Executor上執行任務,運行結束(shu)后,執行結果會返(fan)回給Driver,或者寫到HDFS或者其他數據(ju)庫(ku)中。
Spark運行流程
SparkContext對象代表了和一個集群的連接:
- 首先為應用構建起基本的運行環境,即由Driver創建一個SparkContext,進行資源的申請、任務的分配和監控;
- 資源管理器為Executor分配資源,并啟動Executor進程;
- SparkContext根據RDD的依賴關系構建DAG圖,DAG圖提交給DAGScheduler解析成Stage,然后把一個個TaskSet提交給底層調度器TaskScheduler處理;Executor向SparkContext申請Task,Task Scheduler將Task發放給Executor運行,并提供應用程序代碼;
- Task在Executor上運行,把執行結果反饋給TaskScheduler,然后反饋給DAGScheduler,運行完畢后寫入數據并釋放所有資源;