Submitting Applications
在 script in Spark的 bin
目錄中的spark-submit
腳本用與在集羣上啓動應用程序。它可以通過一個統一的接口使用所有
Spark 支持的 cluster managers,所以您不需要專門的爲每個cluster
managers配置您的應用程序。
打包應用依賴
如果您的代碼依賴了其它的項目,爲了分發代碼到 Spark 集羣中您將需要將它們和您的應用程序一起打包。爲此,創建一個包含您的代碼以及依賴的 assembly jar(或者 “uber” jar)。無論是 sbt 還是 Maven 都有
assembly 插件。在創建 assembly jar 時,列出 Spark 和 Hadoop的依賴爲provided
。它們不需要被打包,因爲在運行時它們已經被 Cluster Manager
提供了。如果您有一個 assembled jar 您就可以調用 bin/spark-submit
腳本(如下所示)來傳遞您的 jar。
對於 Python 來說,您可以使用 spark-submit
的 --py-files
參數來添加 .py
, .zip
和 .egg
文件以與您的應用程序一起分發。如果您依賴了多個
Python 文件我們推薦將它們打包成一個 .zip
或者 .egg
文件。
用 spark-submit 啓動應用
如果用戶的應用程序被打包好了,它可以使用 bin/spark-submit
腳本來啓動。這個腳本負責設置 Spark 和它的依賴的 classpath,並且可以支持 Spark 所支持的不同的 Cluster
Manager 以及 deploy mode(部署模式):
./bin/spark-submit \
--class <main-class> \
--master <master-url> \
--deploy-mode <deploy-mode> \
--conf <key>=<value> \
... # other options
<application-jar> \
[application-arguments]
一些常用的 options(選項)有 :
-
--class
: 您的應用程序的入口點(例如。org.apache.spark.examples.SparkPi
) -
--master
: 集羣的 master URL (例如spark://23.195.26.187:7077
) -
--deploy-mode
: 是在 worker 節點(cluster
) 上還是在本地作爲一個外部的客戶端(client
) 部署您的 driver(默認:client
) † -
--conf
: 按照 key=value 格式任意的 Spark 配置屬性。對於包含空格的 value(值)使用引號包 “key=value” 起來。 -
application-jar
: 包括您的應用以及所有依賴的一個打包的 Jar 的路徑。該 URL 在您的集羣上必須是全局可見的,例如,一個hdfs://
path 或者一個file://
在所有節點是可見的。 -
application-arguments
: 傳遞到您的 main class 的 main 方法的參數,如果有的話。
† 常見的部署策略是從一臺 gateway 機器物理位置與您 worker 在一起的機器(比如,在 standalone EC2 集羣中的 Master 節點上)來提交您的應用。在這種設置中, client
模式是合適的。在 client
模式中,driver
直接運行在一個充當集羣 client 的 spark-submit
進程內。應用程序的輸入和輸出直接連到控制檯。因此,這個模式特別適合那些設計 REPL(例如,Spark shell)的應用程序。
另外,如果您從一臺遠離 worker 機器的機器(例如,本地的筆記本電腦上)提交應用程序,通常使用 cluster
模式來降低 driver 和 executor 之間的延遲。目前,Standalone
模式不支持 Cluster 模式的 Python 應用。
對於 Python 應用,在 <application-jar>
的位置簡單的傳遞一個 .py
文件而不是一個
JAR,並且可以用 --py-files
添加 Python .zip
,.egg
或者 .py
文件到
search path(搜索路徑)。
這裏有一些選項可用於特定的 cluster manager 中。例如, Spark
standalone cluster 用 cluster
部署模式, 您也可以指定 --supervise
來確保
driver 在 non-zero exit code 失敗時可以自動重啓。爲了列出所有 spark-submit
, 可用的選項,用 --help
.
來運行它。這裏是一些常見選項的例子 :
# Run application locally on 8 cores
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master local[8] \
/path/to/examples.jar \
100
# Run on a Spark standalone cluster in client deploy mode
./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
# Run on a Spark standalone cluster in cluster deploy mode with supervise
./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
# Run on a YARN cluster
export HADOOP_CONF_DIR=XXX
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \ # can be client for client mode
--executor-memory 20G \
--num-executors 50 \
/path/to/examples.jar \
1000
# Run a Python application on a Spark standalone cluster
./bin/spark-submit \
--master spark://207.184.161.138:7077 \
examples/src/main/python/pi.py \
1000
# Run on a Mesos cluster in cluster deploy mode with supervise
./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 | Meaning |
---|---|
local |
使用一個線程本地運行 Spark(即,沒有並行性)。 |
local[K] |
使用 K 個 worker 線程本地運行 Spark(理想情況下,設置這個值的數量爲您機器的 core 數量)。 |
local[K,F] |
使用 K 個 worker 線程本地運行 Spark並允許最多失敗 F次 (查閱 spark.task.maxFailures 以獲取對該變量的解釋) |
local[*] |
使用更多的 worker 線程作爲邏輯的 core 在您的機器上來本地的運行 Spark。 |
local[*,F] |
使用更多的 worker 線程作爲邏輯的 core 在您的機器上來本地的運行 Spark並允許最多失敗 F次。 |
spark://HOST:PORT |
連接至給定的 Spark standalone cluster master. master。該 port(端口)必須有一個作爲您的 master 配置來使用,默認是 7077。 |
spark://HOST1:PORT1,HOST2:PORT2 |
連接至給定的 Spark standalone cluster with standby masters with Zookeeper. 該列表必須包含由zookeeper設置的高可用集羣中的所有master主機。該 port(端口)必須有一個作爲您的 master 配置來使用,默認是 7077。 |
mesos://HOST:PORT |
連接至給定的 Mesos 集羣. 該 port(端口)必須有一個作爲您的配置來使用,默認是 5050。或者,對於使用了 ZooKeeper 的 Mesos cluster
來說,使用 mesos://zk://... . 。使用 --deploy-mode
cluster , 來提交,該 HOST:PORT 應該被配置以連接到 MesosClusterDispatcher. |
yarn |
連接至一個 YARN cluster in client or cluster mode
取決於 --deploy-mode . 的值在 client 或者 cluster 模式中。該 cluster 的位置將根據 HADOOP_CONF_DIR 或者 YARN_CONF_DIR 變量來找到。 |
從文件中加載配置
spark-submit
腳本可以從一個 properties 文件加載默認的 Spark
configuration values 並且傳遞它們到您的應用中去。默認情況下,它將從 Spark 目錄下的 conf/spark-defaults.conf
讀取配置。更多詳細信息,請看 加載默認配置.
加載默認的 Spark 配置,這種方式可以消除某些標記到 spark-submit
. 的必要性。例如,如果 spark.master
屬性被設置了,您可以在spark-submit
中安全的省略 --master
配置
. 一般情況下,明確設置在 SparkConf
上的配置值的優先級最高,然後是傳遞給 spark-submit
的值,
最後纔是 default value(默認文件)中的值。
如果您不是很清楚其中的配置設置來自哪裏,您可以通過使用 --verbose
選項來運行 spark-submit
打印出細粒度的調試信息。
高級的依賴管理
在使用 spark-submit
時,使用 --jars
選項包括的應用程序的
jar 和任何其它的 jar 都將被自動的傳輸到集羣。在 --jars
後面提供的 URL 必須用逗號分隔。該列表會被包含到 driver 和 executor 的 classpath 中。 --jars
不支持目錄的形式。
Spark 使用下面的 URL 格式以允許傳播 jar 時使用不同的策略 :
-
file: - 絕對路徑和
file:/
URI 通過 driver 的 HTTP file server 提供服務,並且每個 executor 會從 driver 的 HTTP server 拉取這些文件。 - hdfs:, http:, https:, ftp: - 如預期的一樣拉取下載文件和 JAR
- local: - 一個用 local:/ 開頭的 URL 預期作在每個 worker 節點上作爲一個本地文件存在。這樣意味着沒有網絡 IO 發生,並且非常適用於那些已經被推送到每個 worker 或通過 NFS,GlusterFS等共享的大型的 file/JAR。
N注意,那些 JAR 和文件被複制到 working directory(工作目錄)用於在 executor 節點上的每個 SparkContext。這可以使用最多的空間顯著量隨着時間的推移,將需要清理。在 Spark On YARN 模式中,自動執行清理操作。在 Spark standalone 模式中,可以通過配置spark.worker.cleanup.appDataTtl
屬性來執行自動清理。
用戶也可以通過使用 --packages
來提供一個逗號分隔的 maven coordinates(maven 座標)以包含任何其它的依賴。在使用這個命令時所有可傳遞的依賴將被處理。其它的 repository(或者在
SBT 中被解析的)可以使用 --repositories
該標記添加到一個逗號分隔的樣式中。 (注意,對於那些設置了密碼保護的庫,在一些情況下可以在庫URL中提供驗證信息,例如 https://user:password@host/...
.以這種方式提供驗證信息需要小心。)
這些命令可以與 pyspark
, spark-shell
和 spark-submit
配置會使用以包含
Spark Packages(Spark 包)。 對於 Python 來說,也可以使用 --py-files
選項用於分發 .egg
, .zip
和 .py
libraries
到 executor 中。
# 更多信息
如果您已經部署了您的應用程序,集羣模式概述 描述了在分佈式執行中涉及到的組件,以及如何去監控和調試應用程序。