《Spark官方文件》提交Spark應用
提交Spark應用
spark-submit指令碼在Spark的bin目錄下,可以利用此指令碼向叢集提交Spark應用。該指令碼為所有Spark所支援的叢集管理器( cluster managers)提供了統一的介面,因此,你基本上可以用同樣的配置和指令碼,向不同型別的叢集管理器提交你的應用。
打包應用程式依賴
如果你的程式碼依賴於其他工程,那麼你需要把依賴項也打包進來,併發布給Spark叢集。這需要建立一個程式集jar包(或者uber jar),包含你自己的程式碼,同時也包含其依賴項。sbt and Maven 都有assembly外掛。建立程式集jar包時,注意,要把Spark和Hadoop的jar包都可設為provided;這些jar包在Spark叢集上已經存在,不需要再打包進來。完成jar包後,你就可以使用bin/spark-submit來提交你的jar包了。
對於Python,你可以使用spark-submit的–py-files引數,將你的程式以.py、.zip 或.egg檔案格式提交給叢集。如果你需要依賴很多Python檔案,我們推薦你使用.zip或者.egg來打包。
利用spark-submit啟動應用
一旦打包好一個應用程式,你就可以用bin/spark-submit來提交之。這個指令碼會自動設定Spark及其依賴的classpath,同時可以支援多種不同型別的叢集管理器、以及不同的部署模式:
./bin/spark-submit \ --class <main-class> --master <master-url> \ --deploy-mode <deploy-mode> \ --conf <key>=<value> \ ... # 其他選項 <application-jar> \ [application-arguments]
一些常用的選項如下:
--class
: 應用入口類(例如:org.apache.spark.examples.SparkPi
))--master
: 叢集的master URL (如:spark://23.195.26.187:7077)--deploy-mode
: 驅動器程序是在叢集上工作節點執行(cluster),還是在叢集之外客戶端執行(client)(預設:client)--conf
: 可以設定任意的Spark配置屬性,鍵值對(key=value)格式。如果值中包含空白字元,可以用雙引號括起來(”key=value“)。application-jar
: 應用程式jar包路徑,該jar包必須包括你自己的程式碼及其所有的依賴項。如果是URL,那麼該路徑URL必須是對整個叢集可見且一致的,如:hdfs://path 或者application-arguments
: 傳給入口類main函式的啟動引數,如果有的話。
一種常見的部署策略是,在一臺閘道器機器上提交你的應用,這樣距離工作節點的物理距離比較近。這種情況下,client模式會比較適合。client模式下,驅動器直接執行在spark-submit的程序中,同時驅動器對於叢集來說就像是一個客戶端。應用程式的輸入輸出也被繫結到控制檯上。因此,這種模式特別適用於互動式執行(REPL),spark-shell就是這種模式。
當然,你也可以從距離工作節點很遠的機器(如:你的筆記本)上提交應用,這種情況下,通常適用cluster模式,以減少網路驅動器和執行器之間的網路通訊延遲。注意:對於Mesos叢集管理器,Spark還不支援cluster模式。目前,只有YARN上Python應用支援cluster模式。
對於Python應用,只要把<application-jar>換成一個.py檔案,再把.zip、.egg或者.py檔案傳給–py-files引數即可。
有一些引數是專門用於設定叢集管理器的(cluster manager)。例如,在獨立部署( Spark standalone cluster )時,並且使用cluster模式,你可以用–supervise引數來確保驅動器在異常退出情況下(退出並返回非0值)自動重啟。spark-submit –help可檢視完整的選項列表。這裡有幾個常見的示例:
# 本地執行,佔用8個core
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master local[8] \
/path/to/examples.jar \
100
# 獨立部署,client模式
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://207.184.161.138:7077 \
--executor-memory 20G \
--total-executor-cores 100 \
/path/to/examples.jar \
1000
# 獨立部署,cluster模式,異常退出時自動重啟
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://207.184.161.138:7077 \
--deploy-mode cluster
--supervise
--executor-memory 20G \
--total-executor-cores 100 \
/path/to/examples.jar \
1000
# YARN上執行,cluster模式
export HADOOP_CONF_DIR=XXX
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \ # 要client模式就把這個設為client
--executor-memory 20G \
--num-executors 50 \
/path/to/examples.jar \
1000
# 獨立部署,執行python
./bin/spark-submit \
--master spark://207.184.161.138:7077 \
examples/src/main/python/pi.py \
1000
# Mesos叢集上執行,cluster模式,異常時自動重啟
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master mesos://207.184.161.138:7077 \
--deploy-mode cluster
--supervise
--executor-memory 20G \
--total-executor-cores 100 \
http://path/to/examples.jar \
1000
Master URLs
傳給Spark的master URL可以是以下幾種格式:
Master URL | 含義 |
---|---|
local | 本地執行Spark,只用1個worker執行緒(沒有平行計算) |
local[K] | 本地執行Spark,使用K個worker執行緒(理論上,最好將這個值設為你機器上CPU core的個數) |
local[*] | 本地執行Spark,使用worker執行緒數同你機器上邏輯CPU core個數 |
spark://HOST:PORT | 連線到指定的Spark獨立部署的叢集管理器(Spark standalone cluster)。埠是可以配置的,預設7077。 |
mesos://HOST:PORT | 連線到指定的Mesos叢集。埠號可以配置,預設5050。如果Mesos叢集依賴於ZooKeeper,可以使用 mesos://zk://… 來提交,注意 –deploy-mode需要設定為cluster,同時,HOST:PORT應指向 MesosClusterDispatcher. |
yarn | 連線到指定的 YARN 叢集,使用–deploy-mode來指定 client模式 或是 cluster 模式。YARN叢集位置需要通過 $HADOOP_CONF_DIR 或者 $YARN_CONF_DIR 變數來查詢。 |
yarn-client | YARN client模式的簡寫,等價於 –master yarn –deploy-mode client |
yarn-cluster | YARN cluster模式的簡寫,等價於 –master yarn –deploy-mode cluster |
從檔案載入配置
spark-submit指令碼可以從一個屬性檔案載入預設的Spark屬性配置值(Spark configuration values ),並將這些屬性傳給你的應用程式。預設Spark會從 conf/spark-defaults.conf讀取這些屬性配置。更詳細資訊,請參考 loading default configurations.
用這種方式載入預設Spark屬性配置,可以在呼叫spark-submit指令碼時省略一些引數標誌。例如:如果屬性檔案中設定了spark.master屬性,那麼你就以忽略spark-submit的–master引數。通常,在程式碼裡用SparkConf中設定的引數具有最高的優先順序,其次是spark-submit中傳的引數,再次才是spark-defaults.conf檔案中的配置值。
如果你總是搞不清楚最終生效的配置值是從哪裡來的,你可以通過spark-submit的–verbose選項來列印細粒度的除錯資訊。
高階依賴管理
通過spark-submit提交應用時,application jar和–jars選項中的jar包都會被自動傳到叢集上。Spark支援以下URL協議,並採用不同的分發策略:
- file: – 檔案絕對路徑,並且file:/URI是通過驅動器的HTTP檔案伺服器來下載的,每個執行器都從驅動器的HTTP server拉取這些檔案。
- hdfs:, http:, https:, ftp: – 設定這些引數後,Spark將會從指定的URI位置下載所需的檔案和jar包。
- local: – local:/ 打頭的URI用於指定在每個工作節點上都能訪問到的本地或共享檔案。這意味著,不會佔用網路IO,特別是對一些大檔案或jar包,最好使用這種方式,當然,你需要把檔案推送到每個工作節點上,或者通過NFS和GlusterFS共享檔案。
注意,每個SparkContext對應的jar包和檔案都需要拷貝到所對應執行器的工作目錄下。一段時間之後,這些檔案可能會佔用相當多的磁碟。在YARN上,這些清理工作是自動完成的;而在Spark獨立部署時,這種自動清理需要配置 spark.worker.cleanup.appDataTtl 屬性。
使用者還可以用–packages引數,通過給定一個逗號分隔的maven座標,來指定其他依賴項。這個命令會自動處理依賴樹。額外的maven庫(或者SBT resolver)可以通過–repositories引數來指定。Spark命令(pyspark,spark-shell,spark-submit)都支援這些引數。
對於Python,也可以使用等價的–py-files選項來分發.egg、.zip以及.py檔案到執行器上。
更多資訊
部署完了你的應用程式後, cluster mode overview 描述了分散式執行中所涉及的各個元件,以及如何監控和除錯應用程式。