《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 或者 file://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 \
https://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 描述了分布式執行中所涉及的各個組件,以及如何監控和調試應用程序。
最後更新:2017-05-19 17:32:10