《Spark官方文檔》集群模式概覽
集群模式概覽
本文簡要描述了Spark在集群中各個組件如何運行。想了解如何在集群中啟動Spark應用,請參考application submission guide 。
組件
Spark應用在集群上運行時,包括了多個獨立的進程,這些進程之間通過你的主程序(也叫作驅動器,即:driver)中的SparkContext對象來進行協調。
特別要指出的是,SparkContext能與多種集群管理器通信(包括:Spark獨立部署時自帶的集群管理器,Mesos或者YARN)。一旦連接上集群管理器,Spark會為該應用在各個集群節點上申請執行器(executor),用於執行計算任務和存儲數據。接下來,Spark將應用程序代碼(JAR包或者Python文件)發送給所申請到的執行器。最後SparkContext將分割出的任務(task)發送給各個執行器去運行。
這個架構中有幾個值得注意的地方:
- 每個Spark應用程序都有其對應的多個執行器進程,執行器進程在整個應用程序生命周期內,都保持運行狀態,並以多線程方式運行所收到的任務。這樣的好處是,可以隔離各個Spark應用,從調度角度來看,每個驅動器可以獨立調度本應用程序內部的任務,從執行器角度來看,不同的Spark應用對應的任務將會在不同的JVM中運行。然而這種架構同樣也有其劣勢,多個Spark應用程序之間無法共享數據,除非把數據寫到外部存儲中。
- Spark對底層的集群管理器一無所知。隻要Spark能申請到執行器進程,並且能與之通信即可。這種實現方式可以使Spark相對比較容易在一個支持多種應用的集群管理器上運行(如:Mesos或YARN)
- 驅動器(driver)程序在整個生命周期內必須監聽並接受其對應的各個執行器的連接請求(參考:spark.driver.port and spark.fileserver.port in the network config section)。因此,驅動器程序必須能夠被所有worker節點訪問到。
- 因為集群上的任務是由驅動器來調度的,所以驅動器應該和worker節點距離近一些,最好在同一個本地局域網中。如果你需要遠程對集群發起請求,最好還是在驅動器節點上啟動RPC服務,來響應這些遠程請求,同時把驅動器本身放在集群worker節點比較近的機器上。
集群管理器類型
Spark支持以下3中集群管理器:
- Standalone – Spark自帶的一個簡單的集群管理器,這使得啟動一個Spark集群變得非常簡單。
- Apache Mesos – 一種可以運行Hadoop MapReduce或者服務型應用的通用集群管理器。
- Hadoop YARN – Hadoop 2的集群管理器。
另外,使用Spark的EC2 launch scripts可以輕鬆地在Amazon EC2上啟動一個獨立集群。
提交Spark應用
利用spark-submit腳本,可以向Spark所支持的任意一種集群提交應用。詳見:application submission guide
監控
每一個驅動器(driver)都有其對應的web UI,默認會綁定4040端口(多個並存會按順序綁定4041、4042…),這個web UI會展示該Spark應用正在運行的任務(task)、執行器(executor)以及所使用的存儲信息。隻需在瀏覽器種打開https://<driver-node>:4040即可訪問。monitoring guide 詳細描述了其他監控選項。
作業調度
Spark可以在應用程序之間(集群管理器這一層麵)和之內(如:同一個SparkContext對象運行了多個計算作業)控製資源分配。job scheduling overview 描述了更詳細的信息。
概念和術語
下表簡要說明了集群模式下的一些概念和術語:
術語 | 含義 |
---|---|
Application(應用) | Spark上運行的應用。包含了驅動器(driver)進程(一個)和集群上的執行器(executor)進程(多個) |
Application jar(應用jar包) | 包含Spark應用程序的jar包。有時候,用戶會想要把應用程序代碼及其依賴打到一起,形成一個“uber jar”(包含自身以及所有依賴庫的jar包),注意這時候不要把Spark或Hadoop的庫打進來,這些庫會在運行時加載 |
Driver program(驅動器) | 運行main函數並創建SparkContext的進程。 |
Cluster manager(集群管理器) | 用於在集群上申請資源的 外部服務(如:獨立部署的集群管理器、Mesos或者YARN) |
Deploy mode(部署模式) | 用於區分驅動器進程在哪裏運行。在”cluster”模式下,驅動器將運行在集群上某個節點;在”client“模式下,驅動器在集群之外的客戶端運行。 |
Worker node(工作節點) | 集群上運行應用程序代碼的任意一個節點。 |
Executor(執行器) | 在集群工作節點上,為某個應用啟動的工作進程;專門用於運行計算任務,並在內存或磁盤上保存數據。每個應用都獨享其對應的多個執行器。 |
Task(任務) | 下發給執行器的工作單元。 |
Job(作業) | 一個並行計算作業,由一組任務(Task)組成,並由Spark的行動(action)算子(如:save、collect)觸發啟動;你會在驅動器日誌中看到這個術語。 |
Stage(步驟) | 每個作業(Job)可以劃分為更小的任務(Task)集合,這就是步驟(Stage),這些步驟彼此依賴形成一個有向無環圖(類似於MapReduce中的map和reduce);你會在驅動器日誌中看到這個術語。 |
最後更新:2017-05-19 17:32:14