Spark應用提交
在 Spark 的 bin 目錄中的 spark-submit 指令碼用與在叢集上啟動應用程式。它可以通過一個統一的介面使用所有 Spark 支援的 Cluster Manager,所以您不需要專門的為每個 Cluster Manager 來配置您的應用程式。
打包應用依賴
如果您的程式碼依賴了其它的專案,為了分發程式碼到 Spark 叢集中您將需要將它們和您的應用程式一起打包。為此,建立一個包含您的程式碼以及依賴的 assembly jar(或者 “uber
對於 Python
用 spark-submit 啟動應用
如果使用者的應用程式被打包好了,它可以使用 bin/spark-submit 指令碼來啟動。這個指令碼負責設定 Spark 和它的依賴的 classpath
./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:// path 在所有節點是可見的。
- 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 URL
傳遞給 Spark 的 master URL 可以使用下列格式中的一種 :
Master URL |
Meaning |
---|---|
local |
使用一個執行緒本地執行 Spark(即,沒有並行性)。 |
local[K] |
使用 K 個 worker 執行緒本地執行 Spark(理想情況下,設定這個值的數量為您機器的 core 數量)。 |
local[*] |
使用更多的 worker 執行緒作為邏輯的 core 在您的機器上來本地的執行 Spark。 |
spark://HOST:PORT |
連線至給定的 Spark standalone cluster master。該 port(埠)必須有一個作為您的 master 配置來使用,預設是 7077. |
mesos://HOST:PORT |
連線至給定的 Mesos cluster。該 port(埠)必須有一個作為您的配置來使用,預設是 5050。或者,對於使用了 ZooKeeper 的 Mesos cluster 來說,使用 mesos://zk://...。使用 --deploy-mode cluster 來提交,該 HOST:PORT 應該被配置以連線到 MesosClusterDispatcher。 |
yarn |
連線至一個 YARN cluster,部署是在 client 或者 cluster 模式取決於 --deploy-mode 的值。該 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 中安全的省略。一般情況下,明確設定在 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 發生,並且非常適用於那些通過 NFS,GlusterFS,等推倒每個 worker 或共享大型的 file/JAR。
注意,那些 JAR 和檔案被複制到 working directory(工作目錄)用於在 executor 節點上的每個 SparkContext。這可以使用最多的空間顯著量隨著時間的推移,將需要清理。在 Spark On YARN 模式中,自動執行清理操作。在 Spark standalone 模式中,可以通過配置 spark.worker.cleanup.appDataTtl 屬性來執行自動清理。
使用者也可以通過使用 --packages 來提供一個逗號分隔的 maven coordinates(maven 座標)以包含任何其它的依賴。在使用這個命令時所有可傳遞的依賴將被處理。其它的 repository(或者在 SBT 中被解析的)可以使用 --repositoies 該標記新增到一個逗號分隔的樣式中。這些命令可以與 pyspark,spark-shell 和 spark-submit 配置會使用以包含 Spark Packages(Spark 包)。
對於 Python 來說,也可以使用 --py-files 選項用於分發 .egg,.zip 和 .py libraries 到 executor 中。