英文標題:Cluster Mode Overview
英文原址:http://spark.apache.org/docs/latest/cluster-overview.html
Spark Version:1.3.1(2015-04-17)
1, Spark核心組件
Spark應用程序作爲一個獨立的任務集運行在集羣上,由主程序(driver program)中的SparkContext來協調控制。當運行在集羣上時,SparkContext可以連接到不同的集羣管理器(Spark自帶的Standalone或Mesos/YARN),由它們爲應用程序分配資源。一旦連接上集羣管理器,Spark就開始請求Worker節點上的Executors(Executors是用來執行計算任務、存儲數據的進程),然後將你的應用程序代碼(傳給SparkContext的Jar包或Python文件)發送給Executors,最後SparkContext將任務發送給Executors去執行。
對於以上這個框架有一些值得一提的點:
- 每個應用程序都擁有獨自的Executors進程,這些進程在應用程序多線程運行任務的整個期間都是存在的,在調度端(每個driver調度自己的任務)和Executor端(運行在不同JVM中不同應用程序的任務),這對應用程序之間的隔離是有益處的。同時,這樣的弊端是在不將數據寫出到存儲系統的情況下,無法進行跨應用程序(SparkContext)的數據共享。
- Spark不知道底層的集羣管理器是哪一個。只要應用程序能請求到Executors進程,進程間可以通信,那麼應用程序運行在支持其它應用程序的集羣管理器上相對來說就比較容易了。
- 主程序(Driver Program)必須監聽driver端口,以接收在其整個生命週期內來自它Executors的連接請求。同樣地,主程序必須是Worder節點在網絡內可訪問的。
- 因爲Driver在集羣上調度任務,因此Driver應該要靠近Worker節點,最好是在同一個局域網內。若要發送請求給一個遠程集羣,最好是對Driver打開RPC服務。
2, 集羣管理器類型
系統目前支持3個集羣管理器:
- Standalone,Spark自帶的集羣管理器,用這種方式很容易安裝集羣;
- Apache Mesos,一個既可以運行Hadoop MapReduce也可以運行服務應用-程序的通用集羣管理器;
- Hadoop Yarn,Hadoop 2中的資源管理器。
此外,Spark的“EC2啓動腳本”可以很輕鬆的在Amazon EC2上啓動一個Standalone集羣。
3, 提交應用程序
應用程序可以用spark-submit腳本提交給任何一類集羣,《【Spark1.3官方翻譯】 Spark Submit提交應用程序》描述瞭如何提交應用程序。
4, 監控
每個主程序都有一個web UI,端口是4040。它顯示了正在運行的任務、Executors、存儲情況的信息。簡單地在瀏覽器的地址欄中輸入http://:4040就可以訪問。《【Spark1.3.1官方翻譯】 Monitoring Guide監控》描述了這些監控選項。
5, 作業調度
Spark對跨應用程序(在集羣管理器級別)和應用程序內(同一個SparkContext中產生的多個計算)的資源分配進行了控制。《【Spark1.3.1官方翻譯】 Job Scheduling Overview作業調度概述》進行詳細描述。
6, 組件表
下面彙總了涉及到集羣概念中的一些術語:
- Application,在Spark上構建的用戶程序,由Driver Program和集羣中的Executors構成。
- Application Jar,Jar包含了用戶的Spark應用程序,某些情況下,用戶想創建uber jar來包含應用程序的依賴。用戶的Jar決不應該包括Hadoop或Spark的庫,因爲這些庫在運行時會自動添加。
- Driver Program,運行應用程序的main()函數的進程,並由它創建SparkContext。
- Cluster Manager,集羣中用於請求資源的外部服務。
-Deploy Mode,用來區分Driver進程運行在哪,“Cluster”模式中,在集羣內啓動Driver,“Client”模式中,由集羣外的作業提交者啓動Driver。 - Worker Node,集羣中任意可運行應用程序代碼的節點。
- Executor,在Worker節點爲應用程序啓動的工作進程,由它來執行任務,將數據跨節點保存在內存中或硬盤上。每個應用程序都有自己的Executors。
- Task,發送給一個Executor的工作單元。
- Job,由Spark的action操作觸發的多任務組成的並行計算,可以在Driver日誌中看到這個術語。
- Stage,每個Job被分成小的任務集就叫做Stage,它們之間相互依賴(類似於MapReduce中的map和reduce階段),也可以在Driver日誌中看到這個術語。