Spark是一個基于內(nèi)存的用于處理灼捂、分析大數(shù)據(jù)的集群計算框架末购。Spark最初由美國加州大學(xué)伯克利分校(UC Berkelely)的AMP(Algorithm,Machines and People)實驗室與2009年開發(fā),是基于內(nèi)存計算的大數(shù)據(jù)并行計算框架戳鹅,可以用于構(gòu)建大型的、低延遲的數(shù)據(jù)分析應(yīng)用程序昏兆。
1.Spark概述
Spark是一個基于內(nèi)存的用于處理枫虏、分析大數(shù)據(jù)的集群計算框架。它提供了一套簡單的編程接口爬虱,從而使得應(yīng)用程序開發(fā)者方便使用集群節(jié)點的CPU隶债、內(nèi)存、存儲資源來處理大數(shù)據(jù)跑筝。以下是伯克利分校的Spark數(shù)據(jù)分析架構(gòu)圖:
可以看出Spark是專注于數(shù)據(jù)的處理分析死讹,而數(shù)據(jù)的存儲還是要借助于Hadoop分布式文件系統(tǒng)HDFS、Amazon S3等實現(xiàn)曲梗,Spark生態(tài)系統(tǒng)可以與Hadoop生態(tài)系統(tǒng)有著很好的兼容赞警。
2.Spark調(diào)度管理基本概念
2.1 Application
基于Spark的應(yīng)用程序,由一個或多個作業(yè)組成虏两。每個應(yīng)用程序的執(zhí)行涉及Driver Program
和集群上的Executors
兩部分愧旦。
Spark application execution involves runtime concepts such as driver, executor, task, job, and stage. Understanding these concepts is vital for writing fast and resource efficient Spark programs.
2.2 Driver Program
Driver Program
中包含了啟動運行函數(shù)main函數(shù)
和一個SparkContext類型的實例
。SparkContext
實例是Application
與Spark集群進行交互的唯一通道定罢,是每一個Application
的入口笤虫。Driver Program
可以運行在任何可以提交作業(yè)的節(jié)點上(Work
,Master
)引颈,并不是必須運行在Master
節(jié)點上耕皮。在實際生產(chǎn)環(huán)境中為了減少Master
的負擔(dān),盡量避免在Master
上提交Driver Program
蝙场。(Spark2.0之后將SparkContext改為SparkSession
)
Spark applications run as independent sets of processes on a cluster, coordinated by the
SparkContext
object in your main program (called the driver program).
2.3 Worker
Worker
是Spark集群中任何可以運行Application
相關(guān)代碼的節(jié)點凌停。
2.4 Executor
Executor
是Worker
上某個Application
啟動的一個進程,該進程負責(zé)執(zhí)行Task
任務(wù)并且負責(zé)將數(shù)據(jù)存儲在內(nèi)存或者磁盤中售滤。Executor
擁有CPU和內(nèi)存資源罚拟,它是資源管理系統(tǒng)能夠給予的最小單位台诗。一個Worker
節(jié)點上可能有多個Executor
,但是每個Executor
中僅執(zhí)行一個Application
對應(yīng)的任務(wù)赐俗。也就是說拉队,不同的Application
通過Executor
無法共享數(shù)據(jù)。
A process launched for an application on a worker node, that runs tasks and keeps data in memory or disk storage across them. Each application has its own executors.
2.5 Task
Task
即任務(wù)阻逮,是被送到Executor
上執(zhí)行的工作單元粱快。RDD
中的每個分區(qū)都對應(yīng)相應(yīng)的Task,而每個Task
對應(yīng)于Executor
中的一個線程叔扼,這使得系統(tǒng)更加輕量級事哭,Task
之間切換時間延遲更短。
A unit of work that will be sent to one executor
2.6 Job
Job
即作業(yè)瓜富,是包含多個Task
的并行計算鳍咱,其與Application
中的執(zhí)行操作一一對應(yīng),也就是說Application
每提交一個執(zhí)行操作Spark
對應(yīng)生成一個Job
与柑。
A parallel computation consisting of multiple tasks that gets spawned in response to a Spark action (e.g.
save
,collect
); you'll see this term used in the driver's logs.
2.7 Stage
通常執(zhí)行操作之前會有若干轉(zhuǎn)換操作谤辜,而每個轉(zhuǎn)換操作意味著父RDD到子RDD的轉(zhuǎn)換,因此一個Job中通常涉及多個RDD价捧。將Job中涉及的RDD進行分組丑念,每組稱為一個Stage
。
Each job gets divided into smaller sets of tasks called stages that depend on each other (similar to the map and reduce stages in MapReduce); you'll see this term used in the driver's logs.
2.8 DAG
DAG
是Directed Acyclic Graph
(有向無環(huán)圖)的簡稱结蟋,反映RDD之間的依賴關(guān)系渠欺。
2.9 Cluster Manager
是在集群上獲取資源的外部服務(wù)。若是Standalone
模式的Spark集群椎眯,Cluster Manager
即為Master
;若是基于YARN
模式Spark集群胳岂,Cluster Manager
即為Resource Manager
编整。
3.Spark架構(gòu)設(shè)計
Spark運行架構(gòu)包括集群資源管理器(Cluster Manager
)、運行作業(yè)任務(wù)的工作節(jié)點(Worker Node
)乳丰、每個應(yīng)用的任務(wù)控制節(jié)點(Driver
)和每個工作節(jié)點上負責(zé)具體任務(wù)的執(zhí)行進程(Executor
)掌测,資源管理器可以自帶或Mesos
或YARN
。與Hadoop MapReduce
計算框架相比产园,Spark所采用的Executor有
兩個優(yōu)點:
- 1汞斧、是利用多線程來執(zhí)行具體的任務(wù),減少任務(wù)的啟動開銷
- 2什燕、是
Executor
中有一個BlockManager
存儲模塊粘勒,會將內(nèi)存和磁盤共同作為存儲設(shè)備,有效減少IO開銷
一個Application
由一個Driver
和若干個Job
構(gòu)成屎即,一個Job
由多個Stage
構(gòu)成庙睡,一個Stage
由多個沒有Shuffle
關(guān)系的Task組成事富。
當(dāng)執(zhí)行一個Application
時,Driver
會向集群管理器申請資源乘陪,啟動Executor
统台,并向Executor
發(fā)送應(yīng)用程序代碼和文件,然后在Executor
上執(zhí)行Task
啡邑,運行結(jié)束后贱勃,執(zhí)行結(jié)果會返回給Driver
,或者寫到HDFS
或者其他數(shù)據(jù)庫中谤逼。
4.Spark運行基本流程
Spark運行的基本流程如下所示:
- 1贵扰、當(dāng)一個Spark應(yīng)用被提交時,首先需要為這個應(yīng)用構(gòu)建起基本的運行環(huán)境森缠,即由任務(wù)控制節(jié)點(
Driver
)創(chuàng)建一個SparkContext
拔鹰,由SparkContext
負責(zé)和資源管理器(Cluster Manager
)的通信以及進行資源的申請、任務(wù)的分配和監(jiān)控等贵涵。SparkContext
會向資源管理器注冊并申請運行Executor
的資源列肢。 - 2、資源管理器為
Executor
分配資源宾茂,并啟動Executor
進程瓷马,Executor
運行情況將隨著“心跳”發(fā)送到資源管理器上。 - 3跨晴、
SparkContext
根據(jù)RDD的依賴關(guān)系構(gòu)建DAG圖
欧聘,DAG圖
提交給DAG調(diào)度器(DAGScheduler
)進行解析,將DAG圖分解為多個“階段”(每個階段都是一個任務(wù)集)端盆,并且計算出各個階段之間的依賴關(guān)系怀骤,然后把一個個“任務(wù)集”提交給底層的任務(wù)調(diào)度器(TaskScheduler
)進行處理;Executor
向SparkContext
申請任務(wù)焕妙,任務(wù)調(diào)度器將任務(wù)分發(fā)給Executor
運行蒋伦,同時SparkContext
將應(yīng)用程序代碼發(fā)放給Executor
。 - 4焚鹊、任務(wù)在
Executor
上運行痕届,把執(zhí)行結(jié)果反饋給任務(wù)調(diào)度器(TaskScheduler
),然后反饋給DAG調(diào)度器(DAGScheduler
)末患,運行完畢后寫入數(shù)據(jù)并釋放所有資源研叫。
具體的運行流程圖如下所示,結(jié)合兩幅圖進行學(xué)習(xí):
總體而言璧针,Spark運行架構(gòu)具有以下特點:
- 1嚷炉、每個
Application
都有自己專屬的Executor
進程,并且該進程在Application
運行期間一直駐留陈莽。Executor
進程以多線程的方式運行Task
- 2渤昌、Spark運行過程與資源管理器無關(guān)虽抄,只要能夠獲取
Executor
進程并保持通信即可 - 3、Task采用了數(shù)據(jù)本地性和推測執(zhí)行等優(yōu)化機制