《Spark 官方文件》Spark獨立模式
Spark獨立模式
Spark除了可以在Mesos和YARN叢集上執行之外,還支援一種簡單的獨立部署模式。獨立部署模式下,你既可以手工啟動(手動執行master和workers),也可以利用我們提供的啟動指令碼(launch scripts)。同時,獨立部署模式下,你可以在單機上執行這些程式,以方便測試。
Spark叢集獨立安裝
要獨立安裝Spark,你只需要將編譯好的Spark包複製到叢集中每一個節點上即可。你可以下載一個編譯好的Spark版本,也可以在這裡自己編譯一個版本(build it yourself)。
手動啟動叢集
執行以下命令,啟動獨立部署的master server:
./sbin/start-master.sh
一旦啟動完成,master會打印出master URL(spark://HOST:PORT),後續worker需要用這個URL來連線master,寫程式碼的時候SparkContext中的master引數也需要設定成這個master URL。你還可以在master的web UI(預設為http://localhost:8080)上檢視master URL。
類似地,你可以通過以下命令,啟動一個或多個worker節點,並將其連線到master:
./sbin/start-slave.sh <master-spark-URL>
啟動一個worker以後,重新整理一下master的web UI(預設為
最後,以下配置選項將會被傳給master和worker:
引數 | 含義 |
---|---|
-h HOST , --host HOST |
監聽的主機名 |
-i HOST , --ip HOST |
監聽的主機名(已經廢棄,請使用-h 或者 –host) |
-p PORT , --port PORT |
服務監聽的埠(master節點預設7077,worker節點隨機) |
--webui-port PORT |
web UI埠(master節點預設8080,worker節點預設8081) |
-c CORES , --cores CORES |
單節點上,Spark應用能夠使用的CPU core數上限(預設,等於CPU core的個數);僅worker節點有效 |
-m MEM , --memory MEM |
單節點上,Spark應用能夠使用的記憶體上限,格式為1000M 或者 2G(預設為,機器上所有記憶體減去1G);僅worker節點有效 |
-d DIR , --work-dir DIR |
工作目錄,同時job的日誌也輸出到該目錄(預設:${SPAKR_HOME}/work);僅worker節點有效 |
--properties-file FILE |
自定義Spark屬性檔案的載入路徑(預設:conf/spark-defaults.conf) |
叢集啟動指令碼
要使用啟動指令碼,來啟動一個Spark獨立部署叢集,首先你需要在Spark目錄下建立一個檔案conf/slaves,並且在檔案中寫入你需要作為worker節點啟動的每一臺機器主機名(或IP),每行一臺機器。如果conf/slaves檔案不存在,啟動指令碼會預設會用單機方式啟動,這種方式對測試很有幫助。注意,master節點訪問各個worker時使用ssh。預設情況下,你需要配置ssh免密碼登陸(使用祕鑰檔案)。如果你沒有設定免密碼登陸,那麼你也可以通過環境變數SPARK_SSH_FOREGROUND來一個一個地設定每個worker的密碼。
設定好conf/slaves檔案以後,你就可以用一下shell指令碼來啟動或停止叢集了,類似於Hadoop的部署,這些指令碼都在${SPARK_HOME}/sbin目錄下:
sbin/start-master.sh
– 在本機啟動一個master例項sbin/start-slaves.sh
– 在conf/slaves檔案所指定的每一臺機器上都啟動一個slave例項sbin/start-slave.sh
– 在本機啟動一個slave例項sbin/start-all.sh
– 啟動一個master和多個slave例項,詳細見上面的描述。sbin/stop-master.sh
– 停止 start-master.sh所啟動的master例項sbin/stop-slaves.sh
– 停止所有在conf/slaves中指定的slave例項sbin/stop-all.sh
– 停止master節點和所有slave節點,詳細見上面的描述
注意,這些指令碼都需要在你啟動Spark master的機器上執行,而不是你的本地機器。
Spark獨立部署叢集的其他可選的環境變數見conf/spark-env.sh。你可以通過複製conf/spark-env.sh.template來建立這個檔案,同時你還需要將配置好的檔案複製到所有的worker節點上。以下是可用的設定:
環境變數 | 含義 |
---|---|
SPARK_MASTER_IP |
master例項繫結的IP地址,例如,繫結到一個公網IP |
SPARK_MASTER_PORT |
mater例項繫結的埠(預設7077) |
SPARK_MASTER_WEBUI_PORT |
master web UI的埠(預設8080) |
SPARK_MASTER_OPTS |
master專用配置屬性,格式如”-Dx=y” (預設空),可能的選項請參考下面的列表。 |
SPARK_LOCAL_DIRS |
Spark的本地工作目錄,包括:對映輸出的臨時檔案和RDD儲存到磁碟上的臨時資料。這個目錄需要快速訪問,最好設成本地磁碟上的目錄。也可以通過使用逗號分隔列表,將其設成多個磁碟上的不同路徑。 |
SPARK_WORKER_CORES |
本機上Spark應用可以使用的CPU core上限(預設所有CPU core) |
SPARK_WORKER_MEMORY |
本機上Spark應用可以使用的記憶體上限,如:1000m,2g(預設為本機所有記憶體減去1GB);注意每個應用單獨使用的記憶體大小要用 spark.executor.memory 屬性配置的。 |
SPARK_WORKER_PORT |
Spark worker繫結的埠(預設隨機) |
SPARK_WORKER_WEBUI_PORT |
worker web UI埠(預設8081) |
SPARK_WORKER_INSTANCES |
每個slave機器上啟動的worker例項個數(預設:1)。如果你的slave機器非常強勁,可以把這個值設為大於1;相應的,你需要設定SPARK_WORKER_CORES引數來顯式地限制每個worker例項使用的CPU個數,否則每個worker例項都會使用所有的CPU。 |
SPARK_WORKER_DIR |
Spark worker的工作目錄,包括worker的日誌以及臨時儲存空間(預設:${SPARK_HOME}/work) |
SPARK_WORKER_OPTS |
worker的專用配置屬性,格式為:”-Dx=y”,可能的選項請參考下面的列表。 |
SPARK_DAEMON_MEMORY |
Spark master和worker後臺程序所使用的記憶體(預設:1g) |
SPARK_DAEMON_JAVA_OPTS |
Spark master和workers後臺程序所使用的JVM選項,格式為:”-Dx=y”(預設空) |
SPARK_PUBLIC_DNS |
Spark master和workers使用的公共DNS(預設空) |
注意: 啟動指令碼目前不支援Windows。如需在Windows上執行,請手工啟動master和workers。
SPARK_MASTER_OPTS支援以下屬性:
屬性名 | 預設值 | 含義 |
---|---|---|
spark.deploy.retainedApplications |
200 | web UI上最多展示幾個已結束應用。更早的應用的數將被刪除。 |
spark.deploy.retainedDrivers |
200 | web UI上最多展示幾個已結束的驅動器。更早的驅動器程序資料將被刪除。 |
spark.deploy.spreadOut |
true | 獨立部署叢集的master是否應該儘可能將應用分佈到更多的節點上;設為true,對資料本地性支援較好;設為false,計算會收縮到少數幾臺機器上,這對計算密集型任務比較有利。 |
spark.deploy.defaultCores |
(無限制) | Spark獨立模式下應用程式預設使用的CPU個數(沒有設定spark.cores.max的情況下)。如果不設定,則為所有可用CPU個數(除非設定了spark.cores.max)。如果叢集是共享的,最好將此值設小一些,以避免使用者佔滿整個叢集。 |
spark.worker.timeout |
60 | 如果master沒有收到worker的心跳,那麼將在這麼多秒之後,master將丟棄該worker。 |
SPARK_WORKER_OPTS支援以下屬性:
屬性名 | 預設值 | 含義 |
---|---|---|
spark.worker.cleanup.enabled |
false | 是否定期清理 worker 和應用的工作目錄。注意,該設定僅在獨立模式下有效,YARN有自己的清理方式;同時,只會清理已經結束的應用對應的目錄。 |
spark.worker.cleanup.interval |
1800 (30 minutes) | worker清理本地應用工作目錄的時間間隔(秒) |
spark.worker.cleanup.appDataTtl |
7 * 24 * 3600 (7 days) | 清理多久以前的應用的工作目錄。這個選項值將取決於你的磁碟總量。spark應用會將日誌和jar包都放在其對應的工作目錄下。隨著時間流逝,應用的工作目錄很快會佔滿磁碟,尤其是在你的應用提交比較頻繁的情況下。 |
連線到叢集
要在Spark叢集上執行一個應用,只需把spark://IP:PORT這個master URL傳給SparkContext(參考SparkContext
constructor)
如需要執行互動式的spark shell,執行如下命令:
./bin/spark-shell --master spark://IP:PORT
你也可以通過設定選線 –total-executor-cores <numCores> 來控制spark-shell在叢集上使用的CPU總數。
啟動Spark應用
spark-submit指令碼(spark-submit
script )是提交spark應用最簡潔的方式。對於獨立安裝的叢集來說,spark目前支援兩種執行模式。客戶端(client)模式下,驅動器程序(driver)將在提交應用的機器上啟動。而在叢集(cluster)模式下,驅動器(driver)將會在叢集中的某一臺worker上啟動,同時提交應用的客戶端在提交動作完成之後立即退出,而不會等到Spark應用執行結束。
如果你的應用時通過spark-submit提交啟動的,那麼應用對應的jar包會自動釋出到所有的worker節點上。任何額外的依賴項jar包,都必須在–jars引數中指明,並以逗號分隔(如:–jars jar1,jar2)。
另外,獨立安裝的叢集還支援異常退出(返回值非0)時自動重啟。要啟用這個特性,你需要在spark-submit時指定–supervise引數。其後,如果你需要殺掉一個重複失敗的應用,你可能需要執行如下指令:
./bin/spark-class org.apache.spark.deploy.Client kill <master url> <driver ID>
你可以在master web UI(http://<master url>:8080)上檢視驅動器ID。
資源排程
獨立安裝叢集目前只支援簡單的先進先出(FIFO)排程器。這個排程器可以支援多使用者,你可以控制每個應用所使用的最大資源。預設情況下,Spark應用會申請叢集中所有的CPU,這不太合理,除非你的進群同一時刻只執行一個應用。你可以通過SparkConf中的spark.cores.max,來設定一個CPU帽子以限制其使用的CPU總數。例如:
val conf = new SparkConf()
.setMaster(...)
.setAppName(...)
.set("spark.cores.max", "10")
val sc = new SparkContext(conf)
另外,你也可以通過conf/spark-env.sh中的spark.deploy.defaultCores設定應用預設使用的CPU個數(特別針對沒有設定spark.cores.max的應用)。
export SPARK_MASTER_OPTS="-Dspark.deploy.defaultCores=<value>"
在一些共享的叢集上,使用者很可能忘記單獨設定一個最大CPU限制,那麼這個引數將很有用。
監控和日誌
Spark獨立安裝模式提供了一個基於web的叢集監控使用者介面。master和每個worker都有其對應的web UI,展示叢集和Spark作業的統計資料。預設情況下,你可以在master機器的8080埠上訪問到這個web UI。這個埠可以通過配置檔案或者命令列來設定。
另外,每個作業的詳細日誌,將被輸出到每個slave節點上的工作目錄下(預設為:${SPARK_HOME}/work)。每個Spark作業下都至少有兩個日誌檔案,stdout和stderr,這裡將包含所有的輸出到控制檯的資訊。
和Hadoop同時執行
你可以讓Spark和已有的Hadoop在同一叢集上同時執行,只需要將Spark作為獨立的服務啟動即可。這樣Spark可以通過hdfs:// URL來訪問Hadoop上的資料(通常情況下是,hdfs://<namenode>:9000/path,你可以在Hadoop Namenode的web UI上找到正確的連結)。當然,你也可以為Spark部署一個獨立的叢集,這時候Spark仍然可以通過網路訪問HDFS上的資料;這會比訪問本地磁碟慢一些,但如果Spark和Hadoop叢集都在同一個本地區域網內的話,問題不大(例如,你可以在Hadoop叢集的每個機架上新增一些部署Spark的機器)。
網路安全埠配置
Spark會大量使用網路資源,而有些環境會設定嚴密的防火牆設定,以嚴格限制網路訪問。完整的埠列表,請參考這裡:security page.
高可用性
預設情況下,獨立排程的叢集能夠容忍worker節點的失敗(在Spark本身來說,它能夠將失敗的工作移到其他worker節點上)。然而,排程器需要master做出排程決策,而這(預設行為)會造成單點失敗:如果master掛了,任何應用都不能提交和排程。為了繞過這個單點問題,我們有兩種高可用方案,具體如下:
基於Zookeeper的熱備master
概要
利用Zookeeper來提供領導節點選舉以及一些狀態資料的儲存,你可以在叢集中啟動多個master並連線到同一個Zookeeper。其中一個將被選舉為“領導”,而另一個將處於備用(standby)狀態。如果“領導”掛了,則另一個master會立即被選舉,並從Zookeeper恢復已掛“領導”的狀態,並繼續排程。整個恢復流程(從“領導”掛開始計時)可能需要1到2分鐘的時間。注意,整個延時只會影響新增應用 – 已經執行的應用不會受到影響。
更多關於Zookeeper資訊請參考這裡:here
配置
要啟用這種恢復模式,你可以在spark-env中設定 SPARK_DAEMON_JAVA_OPTS,可用的屬性如下:
系統屬性 | 含義 |
---|---|
spark.deploy.recoveryMode |
設為ZOOKEEPER以啟用熱備master恢復模式(預設空) |
spark.deploy.zookeeper.url |
Zookeeper叢集URL(如:192.168.1.100:2181,192.168.1.101:2181) |
spark.deploy.zookeeper.dir |
用於儲存可恢復狀態的Zookeeper目錄(預設 /spark) |
可能的問題:如果你有多個master,但沒有正確設定好master使用Zookeeper的配置,那麼這些master彼此都不可見,並且每個master都認為自己是“領導”。這件會導致整個叢集處於不穩定狀態(多個master都會獨立地進行排程)
詳細
如果你已經有一個Zookeeper叢集,那麼啟動高可用特性是很簡單的。只需要在不同節點上啟動多個master,並且配置相同的Zookeeper(包括Zookeeper URL和目錄)即可。masters可以隨時新增和刪除。
在排程新提交的Spark應用或者新增worker節點時,需要知道當前”領導“的IP地址。你只需要將以前單個的master地址替換成多個master地址即可。例如,你可以在SparkContext中設定master URL為spark://host1:port1.host2:port2。這會導致SparkContext在兩個master中都進行登記 – 那麼這時候,如果host1掛了,這個應用的配置同樣可以在新”領導“(host2)中找到。
”在master註冊“和普通操作有一個顯著的區別。在Spark應用或worker啟動時,它們需要找當前的”領導“master,並在該master上註冊。一旦註冊成功,它們的狀態將被儲存到Zookeeper上。如果”老領導“掛了,”新領導“將會聯絡所有之前註冊過的Spark應用和worker並通知它們領導權的變更,所以Spark應用和worker在啟動時甚至沒有必要知道”新領導“的存在。
由於這一特性,新的master可以在任何時間新增進來,你唯一需要關注的就是,新的應用或worker能夠訪問到這個master。總之,只要應用和worker註冊成功,其他的你都不用管了。
基於本地檔案系統的單點恢復
概要
利用Zookeeper當然是生成環境下高可用的最佳選擇,但有時候你仍然希望在master掛了的時候能夠重啟之,FILESYSTEM模式能幫你實現這一需求。當應用和worker註冊到master的時候,他們的狀態都將被寫入檔案系統目錄中,一旦master掛了,你只需要重啟master,這些狀態都能夠恢復。
配置
要使用這種恢復模式,你需要在spark-env中設定SPARK_DAEMON_JAVA_OPTS,可用的屬性如下:
系統屬性 | 含義 |
---|---|
spark.deploy.recoveryMode |
設為FILESYSTEM以啟用單點恢復模式(預設空) |
spark.deploy.recoveryDirectory |
用於儲存可恢復狀態資料的目錄,master程序必須有訪問許可權 |
Details(詳細)
- 這個解決方案可以用於和一些監控、管理系統進行串聯(如:monit),或者與手動重啟相結合。
- 至少,基於檔案系統工單恢復總比不能恢復強;同時,這種恢復模式也會是開發或者實驗場景下的不錯的選擇。在某些情況下,通過stop-master.sh殺死master可能不會清理其狀態恢復目錄下的資料,那麼這時候你啟動或重啟master,將會進入恢復模式。這可能導致master的啟動時間長達一分鐘(master可能要等待之前註冊的worker和客戶端超時)。
- 你也可以使用NFS目錄來作為資料恢復目錄(雖然這不是官方宣告支援的)。如果老的master掛了,你可以在另一個節點上啟動master,這個master只要能訪問同一個NFS目錄,它就能夠正確地恢復狀態資料,包括之前註冊的worker和應用(等價於Zookeeper模式)。後續的應用必須使用新的master來進行註冊。