該文檔給出了 Spark 如何在集群上運(yùn)行、使之更容易來(lái)理解所涉及到的組件的簡(jiǎn)短概述
組件
Spark 應(yīng)用在集群上作為獨(dú)立的進(jìn)程組來(lái)運(yùn)行,在您的 main 程序中通過(guò) SparkContext 來(lái)協(xié)調(diào)(稱(chēng)之為 driver 程序)。
具體的說(shuō),為了運(yùn)行在集群上,SparkContext 可以連接至幾種類(lèi)型的 Cluster Manager(既可以用 Spark 自己的 Standlone Cluster Manager,或者 Mesos,也可以使用 YARN),它們會(huì)分配應(yīng)用的資源。一旦連接上,Spark 獲得集群中節(jié)點(diǎn)上的 Executor,這些進(jìn)程可以運(yùn)行計(jì)算并且為您的應(yīng)用存儲(chǔ)數(shù)據(jù)。接下來(lái),它將發(fā)送您的應(yīng)用代碼(通過(guò) JAR 或者 Python 文件定義傳遞給 SparkContext)至 Executor。最終,SparkContext 將發(fā)送 Task 到 Executor 以運(yùn)行。

這里有幾個(gè)關(guān)于這個(gè)架構(gòu)需要注意的地方 :
- 每個(gè)應(yīng)用獲取到它自己的 Executor 進(jìn)程,它們會(huì)保持在整個(gè)應(yīng)用的生命周期中并且在多個(gè)線(xiàn)程中運(yùn)行 Task(任務(wù))。這樣做的優(yōu)點(diǎn)是把應(yīng)用互相隔離,在調(diào)度方面(每個(gè) driver 調(diào)度它自己的 task)和 Executor 方面(來(lái)自不同應(yīng)用的 task 運(yùn)行在不同的 JVM 中)。然而,這也意味著若是不把數(shù)據(jù)寫(xiě)到外部的存儲(chǔ)系統(tǒng)中的話(huà),數(shù)據(jù)就不能夠被不同的 Spark 應(yīng)用(SparkContext 的實(shí)例)之間共享。
- Spark 是不知道底層的 Cluster Manager 到底是什么類(lèi)型的。只要它能夠獲得 Executor 進(jìn)程,并且它們可以和彼此之間通信,那么即使是在一個(gè)也支持其它應(yīng)用的 Cluster Manager(例如,Mesos / YARN)上來(lái)運(yùn)行它也是相對(duì)簡(jiǎn)單的。
- Driver 程序必須在自己的生命周期內(nèi)監(jiān)聽(tīng)和接受來(lái)自它的 Executor 的連接請(qǐng)求。同樣的,driver 程序必須可以從 worker 節(jié)點(diǎn)上網(wǎng)絡(luò)尋址(就是網(wǎng)絡(luò)沒(méi)問(wèn)題)。
- 因?yàn)?driver 調(diào)度了集群上的 task(任務(wù)),更好的方式應(yīng)該是在相同的局域網(wǎng)中靠近 worker 的節(jié)點(diǎn)上運(yùn)行。
Spark支持的Cluster Manager
- Standalone: 包含在 Spark 中使得它更容易來(lái)安裝集群的一個(gè)簡(jiǎn)單的 Cluster Manager。
- Apache Mesos: 一個(gè)通用的 Cluster Manager,它也可以運(yùn)行 Hadoop MapReduce 和其它服務(wù)應(yīng)用。
- Hadoop Yarn: Hadoop 2 中的 resource manager(資源管理器)。
- Kubernetes: 一個(gè)開(kāi)源系統(tǒng),用于自動(dòng)化的進(jìn)行部署,擴(kuò)展和管理應(yīng)用程序的容器。
術(shù)語(yǔ)
下表總結(jié)了您將看到的用于引用集群概念的術(shù)語(yǔ):
| Term(術(shù)語(yǔ)) | Meaning(含義) |
|---|---|
| Application | 用戶(hù)構(gòu)建在 Spark 上的程序。由集群上的一個(gè) driver 程序和多個(gè) executor 組成。 |
| Application jar | 一個(gè)包含用戶(hù) Spark 應(yīng)用的 Jar。有時(shí)候用戶(hù)會(huì)想要去創(chuàng)建一個(gè)包含他們應(yīng)用以及它的依賴(lài)的 “uber jar”。用戶(hù)的 Jar 應(yīng)該沒(méi)有包括 Hadoop 或者 Spark 庫(kù),然而,它們將會(huì)在運(yùn)行時(shí)被添加。 |
| Driver program | 該進(jìn)程運(yùn)行應(yīng)用的 main() 方法并且創(chuàng)建了 SparkContext。 |
| Cluster manager | 一個(gè)外部的用于獲取集群上資源的服務(wù)。(例如,Standlone Manager,Mesos,YARN) |
| Deploy mode | 根據(jù) driver 程序運(yùn)行的地方區(qū)別。在 “Cluster” 模式中,框架在群集內(nèi)部啟動(dòng) driver。在 “Client” 模式中,submitter(提交者)在 Custer 外部啟動(dòng) driver。 |
| Worker node | 任何在集群中可以運(yùn)行應(yīng)用代碼的節(jié)點(diǎn)。 |
| Job | 一個(gè)由多個(gè)任務(wù)組成的并行計(jì)算,并且能從 Spark action 中獲取響應(yīng)(例如 save, collect); 您將在 driver 的日志中看到這個(gè)術(shù)語(yǔ)。 |
| Stage | 每個(gè) Job 被拆分成更小的被稱(chēng)作 stage(階段) 的 task(任務(wù)) 組,stage 彼此之間是相互依賴(lài)的(與 MapReduce 中的 map 和 reduce stage 相似)。您將在 driver 的日志中看到這個(gè)術(shù)語(yǔ)。 |
| Task | 一個(gè)將要被發(fā)送到 Executor 中的工作單元。 |
| Executor | 一個(gè)為了在 worker 節(jié)點(diǎn)上的應(yīng)用而啟動(dòng)的進(jìn)程,它運(yùn)行 task 并且將數(shù)據(jù)保持在內(nèi)存中或者硬盤(pán)存儲(chǔ)。每個(gè)應(yīng)用有它自己的 Executor。 |