1. 程式人生 > >《Spark 官方文件》Spark獨立模式

《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(預設為

http://localhost:8080),你應該可以在這裡看到一個新的節點。

最後,以下配置選項將會被傳給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來進行註冊。