提交應用程式
Spark 的 bin
目錄中的 spark-submit
指令碼用於在叢集上啟動應用程式。它可以使用所有 Spark 支援的 叢集管理員,透過統一的介面,因此您不必特別為每個叢集管理員組態您的應用程式。
打包您的應用程式相依性
如果您的程式碼依賴於其他專案,您需要將它們與您的應用程式一起打包,才能將程式碼分發到 Spark 叢集。為此,請建立一個包含您的程式碼及其相依性的組裝 JAR(或「uber」JAR)。sbt 和 Maven 都有組裝外掛程式。在建立組裝 JAR 時,將 Spark 和 Hadoop 列為 provided
相依性;這些不需要打包,因為它們在執行時由叢集管理員提供。一旦您有了組裝好的 JAR,您就可以呼叫 bin/spark-submit
指令碼,如下所示,同時傳遞您的 JAR。
對於 Python,您可以使用 spark-submit
的 --py-files
參數來新增 .py
、.zip
或 .egg
檔案,以與您的應用程式一起分發。如果您依賴多個 Python 檔案,建議將它們打包成 .zip
或 .egg
。對於第三方 Python 依賴項,請參閱 Python 套件管理。
使用 spark-submit 啟動應用程式
一旦使用者應用程式已打包,就可以使用 bin/spark-submit
腳本來啟動它。此腳本負責使用 Spark 及其依賴項設定類別路徑,並且可以支援 Spark 支援的不同叢集管理員和部署模式
./bin/spark-submit \
--class <main-class> \
--master <master-url> \
--deploy-mode <deploy-mode> \
--conf <key>=<value> \
... # other options
<application-jar> \
[application-arguments]
一些常用的選項是
--class
:您的應用程式的進入點(例如org.apache.spark.examples.SparkPi
)--master
:叢集的 主控端 URL(例如spark://23.195.26.187:7077
)--deploy-mode
:是否將您的驅動程式部署在工作節點(cluster
)上,或作為外部用戶端在本地部署(client
)(預設:client
) †--conf
:任意的 Spark 設定屬性,格式為 key=value。對於包含空白值的「key=value」,請用引號包住(如所示)。多個設定應作為個別參數傳遞。(例如--conf <key>=<value> --conf <key2>=<value2>
)application-jar
:包含您的應用程式和所有依賴項的捆綁 jar 路徑。URL 必須在您的叢集內部可全局看見,例如hdfs://
路徑或存在於所有節點上的file://
路徑。application-arguments
:傳遞給您的主類別主方法的參數(如果有的話)
† 一個常見的部署策略是從與您的工作機器實體共置的閘道機器(例如獨立 EC2 叢集中的主節點)提交您的應用程式。在此設定中,client
模式是適當的。在 client
模式中,驅動程式會直接在 spark-submit
程序中啟動,該程序充當叢集的用戶端。應用程式的輸入和輸出會附加到主控台。因此,此模式特別適合涉及 REPL(例如 Spark shell)的應用程式。
或者,如果您的應用程式是由遠離工作機器的機器(例如,在您的筆記型電腦上)所提交,則通常使用 cluster
模式來最小化驅動程式和執行器之間的網路延遲。目前,獨立模式不支援 Python 應用程式的叢集模式。
對於 Python 應用程式,只需在 <application-jar>
的位置傳遞一個 .py
檔案,並使用 --py-files
將 Python .zip
、.egg
或 .py
檔案新增至搜尋路徑。
有一些選項是特定於正在使用的 叢集管理員。例如,對於具有 cluster
部署模式的 Spark 獨立叢集,您還可以指定 --supervise
以確保如果驅動程式因非零退出碼而失敗,則會自動重新啟動。若要列舉所有此類可供 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 in cluster deploy mode
export HADOOP_CONF_DIR=XXX
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
--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
# Run on a Kubernetes cluster in cluster deploy mode
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master k8s://xx.yy.zz.ww:443 \
--deploy-mode cluster \
--executor-memory 20G \
--num-executors 50 \
http://path/to/examples.jar \
1000
主控端 URL
傳遞給 Spark 的主控端 URL 可以採用下列格式之一
主控端 URL | 意義 |
---|---|
local | 在本地使用一個工作執行緒執行 Spark(即完全沒有並行性)。 |
local[K] | 在本地使用 K 個工作執行緒執行 Spark(理想情況下,將其設定為您的機器上的核心數)。 |
local[K,F] | 在本地使用 K 個工作執行緒和 F 個 maxFailures 執行 Spark(請參閱 spark.task.maxFailures 以了解此變數的說明)。 |
local[*] | 在本地使用與您機器上的邏輯核心數一樣多的工作執行緒執行 Spark。 |
local[*,F] | 在本地使用與您機器上的邏輯核心數一樣多的工作執行緒和 F 個 maxFailures 執行 Spark。 |
local-cluster[N,C,M] | 本機叢集模式僅用於單元測試。它在單一 JVM 中模擬一個分散式叢集,具有 N 個工作執行緒、每個工作執行緒 C 個核心和每個工作執行緒 M MiB 的記憶體。 |
spark://HOST:PORT | 連線到指定的 Spark 獨立叢集 主控端。埠必須是您的主控端設定為使用的埠,預設為 7077。 |
spark://HOST1:PORT1,HOST2:PORT2 | 連線至具有備用主機的給定 Spark 獨立叢集。清單中必須包含使用 Zookeeper 設定的高可用性叢集中所有主機主機。埠必須為每個主機設定為使用的埠,預設為 7077。 |
mesos://HOST:PORT | 連線至給定的 Mesos 叢集。埠必須為設定為使用的埠,預設為 5050。或者,對於使用 ZooKeeper 的 Mesos 叢集,請使用 mesos://zk://... 。若要使用 --deploy-mode cluster 提交,應將 HOST:PORT 設定為連線至 MesosClusterDispatcher。
|
yarn | 根據 --deploy-mode 的值,以 client 或 cluster 模式連線至 YARN 叢集。叢集位置將根據 HADOOP_CONF_DIR 或 YARN_CONF_DIR 變數來尋找。
|
k8s://HOST:PORT | 根據 --deploy-mode 的值,以 client 或 cluster 模式連線至 Kubernetes 叢集。HOST 和 PORT 指的是 Kubernetes API 伺服器。預設使用 TLS 連線。若要強制使用非安全連線,您可以使用 k8s://http://HOST:PORT 。
|
從檔案載入設定
spark-submit
指令碼可以從屬性檔案載入預設 Spark 設定值,並將它們傳遞給您的應用程式。預設情況下,它會從 Spark 目錄中的 conf/spark-defaults.conf
讀取選項。有關更多詳細資訊,請參閱 載入預設設定 一節。
以這種方式載入預設 Spark 組態可以避免需要某些旗標給 spark-submit
。例如,如果設定 spark.master
屬性,您可以安全地從 spark-submit
省略 --master
旗標。一般而言,在 SparkConf
上明確設定的組態值具有最高優先權,然後是傳遞給 spark-submit
的旗標,然後是預設檔案中的值。
如果您曾經不清楚組態選項來自何處,您可以透過執行具有 --verbose
選項的 spark-submit
來列印細緻的偵錯資訊。
進階相依性管理
使用 spark-submit
時,應用程式 jar 以及包含在 --jars
選項中的任何 jar 都會自動傳輸到叢集。在 --jars
之後提供的 URL 必須以逗號分隔。該清單包含在驅動程式和執行器類別路徑中。目錄擴充套件不適用於 --jars
。
Spark 使用下列 URL 架構來允許不同的 jar 散播策略
- file: - 絕對路徑和
file:/
URI 由驅動程式的 HTTP 檔案伺服器提供,且每個執行器都從驅動程式 HTTP 伺服器擷取檔案。 - hdfs:, http:, https:, ftp: - 這些會如預期般從 URI 下載檔案和 JAR
- local: - 預期以 local:/ 開頭的 URI 會存在於每個工作節點上的本機檔案中。這表示不會產生網路 IO,且適用於推送到每個工作節點或透過 NFS、GlusterFS 等共用的大型檔案/JAR。
請注意,JAR 和檔案會複製到執行器節點上每個 SparkContext 的工作目錄。這會隨著時間使用大量的空間,且需要清理。使用 YARN 時,清理會自動處理,使用 Spark 獨立時,可以使用 spark.worker.cleanup.appDataTtl
屬性組態自動清理。
使用者也可以透過提供以逗號分隔的 Maven 座標清單,使用 --packages
來包含任何其他相依性。使用此命令時,所有傳遞相依性都將獲得處理。使用標記 --repositories
,可以以逗號分隔的方式新增其他儲存庫(或 SBT 中的解析器)。(請注意,在某些情況下,密碼保護儲存庫的認證資料可以在儲存庫 URI 中提供,例如 https://user:password@host/...
。以這種方式提供認證資料時要小心。)這些命令可用於 pyspark
、spark-shell
和 spark-submit
,以包含 Spark 套件。
對於 Python,等效的 --py-files
選項可用於將 .egg
、.zip
和 .py
函式庫分發給執行器。
更多資訊
部署應用程式後,叢集模式概觀 會說明分布式執行中涉及的元件,以及如何監控和除錯應用程式。