# Submitting Applications
在 script in Spark的 `bin` 目錄中的`spark-submit` 腳本用與在集群上啟動應用程序。它可以通過一個統一的接口使用所有 Spark 支持的 [cluster managers](cluster-overview.html#cluster-manager-types),所以您不需要專門的為每個[cluster managers](cluster-overview.html#cluster-manager-types)配置您的應用程序。
# 打包應用依賴
如果您的代碼依賴了其它的項目,為了分發代碼到 Spark 集群中您將需要將它們和您的應用程序一起打包。為此,創建一個包含您的代碼以及依賴的 assembly jar(或者 “uber” jar)。無論是 [sbt](https://github.com/sbt/sbt-assembly) 還是 [Maven](http://maven.apache.org/plugins/maven-shade-plugin/) 都有 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](#master-urls)(例如 `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](cluster-overview.html#cluster-manager-types) 中。例如,[Spark standalone cluster](spark-standalone.html) 用 `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](configuration.html#scheduling) 以獲取對該變量的解釋)|
| `local[*]` | 使用更多的 worker 線程作為邏輯的 core 在您的機器上來本地的運行 Spark。 |
| `local[*,F]` | 使用更多的 worker 線程作為邏輯的 core 在您的機器上來本地的運行 Spark并允許最多失敗 F次。 |
| `spark://HOST:PORT` | 連接至給定的 [Spark standalone cluster](spark-standalone.html) master. master。該 port(端口)必須有一個作為您的 master 配置來使用,默認是 7077。 |
| `spark://HOST1:PORT1,HOST2:PORT2` | 連接至給定的 [Spark standalone cluster with standby masters with Zookeeper](spark-standalone.html#standby-masters-with-zookeeper)。該列表必須包含由zookeeper設置的高可用集群中的所有master主機。該 port(端口)必須有一個作為您的 master 配置來使用,默認是 7077。 |
| `mesos://HOST:PORT` | 連接至給定的 [Mesos](running-on-mesos.html) 集群。該 port(端口)必須有一個作為您的配置來使用,默認是 5050。或者,對于使用了 ZooKeeper 的 Mesos cluster 來說,使用 `mesos://zk://...`。使用 `--deploy-mode cluster`,來提交,該 HOST:PORT 應該被配置以連接到 [MesosClusterDispatcher](running-on-mesos.html#cluster-mode)。
| `yarn` | 連接至一個 [YARN](running-on-yarn.html) cluster in `client` or `cluster` mode 取決于 `--deploy-mode`. 的值在 client 或者 cluster 模式中。該 cluster 的位置將根據 `HADOOP_CONF_DIR` 或者 `YARN_CONF_DIR` 變量來找到。 |
# 從文件中加載配置
`spark-submit` 腳本可以從一個 properties 文件加載默認的 [Spark configuration values](configuration.html) 并且傳遞它們到您的應用中去。默認情況下,它將從 Spark 目錄下的 `conf/spark-defaults.conf` 讀取配置。更多詳細信息,請看 [加載默認配置](configuration.html#loading-default-configurations)。
加載默認的 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 中。
# 更多信息
如果您已經部署了您的應用程序,[集群模式概述](cluster-overview.html) 描述了在分布式執行中涉及到的組件,以及如何去監控和調試應用程序。
- Spark 概述
- 編程指南
- 快速入門
- Spark 編程指南
- 構建在 Spark 之上的模塊
- Spark Streaming 編程指南
- Spark SQL, DataFrames and Datasets Guide
- MLlib
- GraphX Programming Guide
- API 文檔
- 部署指南
- 集群模式概述
- Submitting Applications
- 部署模式
- Spark Standalone Mode
- 在 Mesos 上運行 Spark
- Running Spark on YARN
- 其它
- 更多
- Spark 配置
- Monitoring and Instrumentation
- Tuning Spark
- 作業調度
- Spark 安全
- 硬件配置
- Accessing OpenStack Swift from Spark
- 構建 Spark
- 其它
- 外部資源
- Spark RDD(Resilient Distributed Datasets)論文
- 翻譯進度