spark集群部署模式概覽
元素
一個spark應(yīng)用包含運(yùn)行在集群里的一系列進(jìn)程,它們由主程序(稱作driver)里的SparkContext對象協(xié)調(diào)。

運(yùn)行圖
SparkContext可以連接不同的集群管理器( Spark的 standalone cluster manager/ Mesos/YARN),這層抽象使得spark可以利用不同的底層設(shè)施。集群管理器用于分配資源,spark應(yīng)用的運(yùn)行流程與其密切相關(guān)。在連接到集群管理器之后,spark首先在集群的各節(jié)點(diǎn)上獲取executor(用來執(zhí)行結(jié)算和存取數(shù)據(jù));然后,spark將你的代碼(JAR/ Python files /..)發(fā)給executor;最后,由SparkContext分配任務(wù)給executor執(zhí)行。
在這個架構(gòu)中有幾點(diǎn)值得注意:
- 各應(yīng)用程序的executor進(jìn)程是獨(dú)立的,它們的生命周期為整個應(yīng)用程序的運(yùn)行周期,在多線程中運(yùn)行任務(wù)。 這有利于各調(diào)度方(每個driver安排自己的任務(wù))和各執(zhí)行方(不同應(yīng)用程序的任務(wù)運(yùn)行在不同JVM中)之間彼此隔離。但是,這也意味著在不寫入外部存儲的情況下,不能跨Spark應(yīng)用程序(SparkContext的實(shí)例)共享數(shù)據(jù)。
- Spark對底層群集管理器是不可見的。只要可以獲取executor進(jìn)程,并且彼此進(jìn)行通信,即使在也支持其他應(yīng)用程序(例如Mesos / YARN)的集群管理器上運(yùn)行spark也很容易。
- driver必須在其生命周期中偵聽并接收其executors的傳入連接(例如,請參閱網(wǎng)絡(luò)配置部分中的spark.driver.port)。因此,工作節(jié)點(diǎn)必須能從網(wǎng)絡(luò)中尋址到驅(qū)動程序。
- 因?yàn)閐river負(fù)責(zé)調(diào)度集群上的任務(wù),所以它應(yīng)該靠近工作節(jié)點(diǎn)運(yùn)行,最好在一個局域網(wǎng)內(nèi)。 如果要遠(yuǎn)程發(fā)送請求到集群,最好是向driver發(fā)起一個RPC,并讓其從附近提交操作,而不是在遠(yuǎn)離工作節(jié)點(diǎn)的位置直接運(yùn)行驅(qū)動程序。
集群管理器分類
目前支持如下幾種管理器:
- Standalone - Spark內(nèi)置,可以方便的部署集群
- Apache Mesos - 常用的集群管理器,可運(yùn)行Hadoop Mapreduce 和服務(wù)程序
- Hadoop YARN - Hadoop2的資源管理器
- Kubernetes(試驗(yàn)性) - 試驗(yàn)性支持,開發(fā)中,更多可參加項(xiàng)目主頁
應(yīng)用提交
使用spark-submit腳本,可以將應(yīng)用程序提交到一個任意類型的集群中運(yùn)行,這里是詳細(xì)文檔:[application submission guide] 。
監(jiān)控
每個driver都有一個web界面,可以監(jiān)控其上運(yùn)行的任務(wù)、executors和存儲使用情況。具體參見:monitoring guide
任務(wù)調(diào)度
術(shù)語
| 術(shù)語 | 含義 |
|---|---|
| Application | Spark應(yīng)用程序。包括driver程序和集群上的executor |
| Application jar | 一個jar包包含了用戶的spark應(yīng)用。用戶jar包中不應(yīng)該引入Hadoop/spark的庫,它們會在運(yùn)行時被添加 |
| Driver program | 運(yùn)行main()函數(shù)并且創(chuàng)建SparkContext的進(jìn)程 |
| Cluster manager | 用來從集群獲取資源的外部服務(wù) (例如standalone manager, Mesos, YARN) |
| Deploy mode | 決定driver進(jìn)程在哪里運(yùn)行。"cluster" 模式下運(yùn)行在集群內(nèi);"client"模式下,submitter在集群外運(yùn)行driver |
| Worker node | 集群內(nèi)可以運(yùn)行Application的節(jié)點(diǎn) |
| Executor | 一個worker節(jié)點(diǎn)上運(yùn)行的負(fù)責(zé)執(zhí)行任務(wù)和存儲數(shù)據(jù)的進(jìn)程。每個Application擁有自己的executor |
| Task | 可以發(fā)送給executor執(zhí)行的任務(wù)單位 |
| Job | 由多個Task組成的并行計(jì)算,響應(yīng)Spark動作(例如save,collect)而產(chǎn)生;driver日志中可以看到此術(shù)語 |
| Stage | 每個job被分成更小的任務(wù),稱為相互依賴的stage(類似于Map、Reduce);driver日志中可以看到此術(shù)語 |